2013-02-26 81 views
0

我正在尝试为Excel编写一个相当智能的宏。在这种情况下,我有两个独立的工作簿,我正在传递信息。第一个工作簿在列A中列出日期,并在以下列中列出相应的值。像这样:根据日期导入值:Excel宏

enter image description here

正如你所看到的,日期和值不会一致地输入。他们只在某些日子可用。目前的条目在2012年底停止。这个宏的要点是每月增加新的数字。

摘录从工作簿2看起来是这样的: enter image description here

我目前的宏观当前所在的工作簿2和拷贝正确的价值观他们综合练习1 除了日期不一致的可能性,这是伟大的。 “CMP(3年)”部分可能有15天的价值,但“CMP(4年)”部分只有14天的价值。如果我盲目地将这些值复制到一张纸上,他们将不能正确排列。我宁愿会有一个计算的平均,如果日期是缺少

因此,要解决这个问题,我试图在当前的解决方案:

'Grab 1 Month 
Call Import("CMA/FIXED  (4 WEEKS)", "B1", DestinationWorkbook, ExportedWorkbook, 3, 2, False, DestinationDateRange) 

上述方法被调用号码中的各个列位于以及提取日期。

请允许我解释下面应该发生的事情。首先在第二张表中搜索的字符串被传入。这与x和y偏移整数一起使用来定位正确的值。 DestinationSheetName是Workbook1,而ExportedDataSheetName是Workbook2。 isDateImport布尔值在那里告诉方法,这是第一次导入,我们所抓取的是将被添加到Workbook1的列A的第一组日期。 ByRef DateRange是复制并粘贴到Workbook1的A列后指向这些日期的指针。所以很显然,当它最初用于日期时,这是空的。

从那里我们检查我们正在做什么样的导入。如果是日期,我们只需简单地查找,复制和过去。如果不是,我们尝试对定位值进行智能导入。这个想法是创建一个指向两组日期的指针,工作簿1中列A中的日期以及与我们正在复制的值对应的日期。我们希望粘贴位置在每个日期的正确行中。我创建了两个指针,并在两个日期列的开始处指向它们。代替复制粘贴代码,我只是打印到调试窗口。如果指针值彼此匹配。比较日期后,我尝试将指针递增到日期列中的下一个值。

这对于2日期很好,然后当我尝试增加指针时出现错误。

我该如何解决这个错误?或者是有一个更简单的方法来做到这一点?......我知道指针是Excel电子表格有点矫枉过正...

Sub Import(SearchString As String, PasteLocation As String _ 
, DestinationSheetName As Variant _ 
, ExportedDataSheetName As Variant, xOffset As Integer, yOffset As Integer _ 
, isDateImport As Boolean, ByRef DateRange) 


Windows(DestinationSheetName).Activate 
Set newSpot = Range(PasteLocation).End(xlDown) 
newSpot.Select 'remove 
Set newSpot = newSpot.Item(2, 1) 

Windows(ExportedDataSheetName).Activate 
Cells.Find(What:=SearchString, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate 
ActiveCell.Select 


If Not isDateImport Then 

    'intelligent import 
    Set datesColumn = ActiveCell.Item(xOffset, yOffset) 
    datesColumn.Select 'remove 
    Set valuesColumn = datesColumn.Item(1, 2) 
    valuesColumn.Select 'remove 
    Set datesColumn = Range(datesColumn, datesColumn.End(xlDown)) 
    datesColumn.Select 'remove 
    Set valuesColumn = Range(valuesColumn, valuesColumn.End(xlDown)) 
    valuesColumn.Select 'remove 

    Set DateColumnPointer = datesColumn.Item(1, 1) 
    DateColumnPointer.Select 'remove 

    Set DateRangePointer = DateRange.Item(1, 1) 
    Windows(DestinationSheetName).Activate 
    DateRangePointer.Select 'remove 

    For Each cell In valuesColumn 
    If (DateColumnPointer = DateRangePointer) Then 
     Debug.Print "Same" 
    Else 
     Debug.Print "Different" 
    End If 

    'increment Pointers 
    Windows(ExportedDataSheetName).Activate 
    DateColumnPointer = DateColumnPointer.Item(2, 1) 


    Windows(DestinationSheetName).Activate 
    DateRangePointer = DateRangePointer.Item(2, 1) 

    Next 
Else 

'primitive import 
Set cell1 = ActiveCell.Item(xOffset, yOffset) 
If isDateImport Then 
Set cell2 = cell1.End(xlDown) 
Else 
Set cell2 = cell1.End(xlDown).End(xlToRight) 
End If 
Set rng = Range(cell1, cell2) 
rng.Select 
rng.Copy 

Windows(DestinationSheetName).Activate 

If isDateImport Then 
Range("W1").Select 
Else 
Range("V1").Select 
End If 

ActiveSheet.Paste 

'Add grabbed values 
Set numbers = Range(Range("W1"), Range("W1").End(xlDown)) 
numbers.Copy 
newSpot.PasteSpecial xlValues 

End If 

Windows(ExportedDataSheetName).Activate 
Range("A1").Select 
End Sub 
+0

你是否在子例程外全局设置了这些变量? – glh 2013-02-27 11:27:57

回答

0

你需要使用set在增量指针部分,以逐渐提高范围否则只能将下一个单元格的值复制到当前单元格。

'increment Pointers 
Windows(ExportedDataSheetName).Activate 
Set DateColumnPointer = DateColumnPointer.Item(2, 1) 

Windows(DestinationSheetName).Activate 
Set DateRangePointer = DateRangePointer.Item(2, 1) 

除非我已经错过了你的问题的呢?