2013-02-26 83 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) 

除非我已經錯過了你的問題的呢?