2015-01-20 128 views
1

新建VBA,我試圖在片基本上查找列標題到另一個,如果匹配拷貝數據結束了...在字符串數組存儲頭VBA

有人告訴我,我可以存儲我的頭在一個字符串數組然後遍歷並比較標題與我的數組,以查看它們是否匹配。

ie: For each c In 
Sheet1.Range("A1:BA1").offset(rownumber -1) 

但我不確定這是什麼意思?如何將我的標題存儲在字符串數組中?對不起,如果這是一個超級基本問題。我搜索了它,並沒有發現任何解釋如何做到這一點或它意味着什麼。

我的項目:在Sheet1 研究數據。如果出現問題,我想單擊一個按鈕,該按鈕將僅將匹配的列數據複製到指定工作表中的新行。從那裏數據將被審查,然後另一個按鈕將數據導出到MS SQL表。

即:

Sheet1 
A  B  C  D E 
ID  CUR Region Amount Y/N 
1  USD  NA $54 Y 

Sheet2 
    A  B  C  D  E 
Region CUR Amount Type Misc 

所以,如果列E = y時,該行中所有相關的數據複製到一個新的工作表:

Sheet2 (output) 
    A  B  C  D  E 
Region CUR Amount Type Misc 
    NA  USD $54 Null Null 

Sheet2中有列沒有在Sheet1中,反之亦然。 ..也是在每個表中列的順序不一樣。真正的工作表有很多列,每次刷新我的數據時,行數都會改變。我需要循環,直到Sheet1中的列A爲空。

+0

所以簡化;您需要檢查Sheet1中的列E是否爲「Y」,如果是,則將該行中的數據填充到Sheet2中的相應列中? 兩張紙上的列是否總是保持不變,還是會改變? – 2015-01-20 21:07:51

+0

他們有可能改變。我更正了sheet2中的一列。 – user3486773 2015-01-21 02:40:09

回答

2

如何將我的標題存儲在字符串數組中?

一個很實用的方法:

Dim hdlist As String 
Dim sep As String 
hdlist = "ID|CUR|Region|Amount|Y/N"  ' Change this line 
sep = "|" 
Dim hdnames() As String 
hdnames = Split(hdlist, sep, -1, vbBinaryCompare) 

然後你可以使用一個For循環遍歷數組。

+1

您可以跳過幾個步驟,如:HeaderList = Array(「header1」,「header2」)' – 2015-01-20 22:04:06

+0

@ DougGlancy - 是的。當你在數組中有很多元素時,我個人發現這更實用。這是一個品味問題。 – 2015-01-20 23:05:38

+0

這回答了真正的問題,並澄清了他們指的是什麼 – user3486773 2015-01-21 03:03:00

1

下面是一段我認爲滿足您的需求的代碼。我認爲變量名稱是自解釋的,但如果沒有,請跟進。

碼搜索每個細胞起源片的標題行中,看它是否在目標片存在。如果是這樣,它複製相應的信息。

Dim wsOrigin As Worksheet 
Dim wsDest As Worksheet 
Dim nCopyRow As Long 
Dim nPasteRow As Long 
Dim rngFnd As Range 
Dim rngDestSearch As Range 
Dim cel As Range 

Const ORIGIN_ROW_HEADERS = 1 
Const DEST_ROW_HEADERS = 1 


Set wsOrigin = Sheets("Sheet1") 
Set wsDest = Sheets("Sheet2") 

nCopyRow = ActiveCell.Row 
nPasteRow = wsDest.Cells(Rows.Count, 1).End(xlUp).Row + 1 

Set rngDestSearch = Intersect(wsDest.UsedRange, wsDest.Rows(DEST_ROW_HEADERS)) 

For Each cel In Intersect(wsOrigin.UsedRange, wsOrigin.Rows(ORIGIN_ROW_HEADERS)) 
    On Error Resume Next 
     Set rngFnd = rngDestSearch.Find(cel.Value) 

     If rngFnd Is Nothing Then 
      'Do Nothing as Header Does not Exist 
     Else 
      wsDest.Cells(nPasteRow, rngFnd.Column).Value = wsOrigin.Cells(nCopyRow, cel.Column).Value 
     End If 
    On Error GoTo 0 

    Set rngFnd = Nothing 
Next cel 
+0

我很傷心。技術上來說,最重要的答案就是我發佈的問題的答案。但是你用這個^^^把它從公園裏敲了出來。這是我的項目的答案,只需要稍微調整。要研究這個好和長,以瞭解它如何做我一直在努力的日子做。唯一沒有做的是搜索「是/否」列,以查看是否= Y複製之前,然後循環到工作表的底部。一旦我理解了這一點,我會添加這些調整。令人驚歎的是這是多麼的可擴展性。你甚至不需要知道任何標題名稱就可以完成這項工作。好樣的! – user3486773 2015-01-21 03:16:22

+0

謝謝!我想我會盡力幫你解決潛在的問題。關於Y/N列:如果我正確理解您的請求,按鈕點擊將觸發此宏。一旦點擊,按鈕將檢查Y/N列是否確實是Y?如果這是正確的,那麼最簡單的解決方案是將整個代碼塊封裝在IF/ELSE語句中。例如,IF cells(Activecell.row,5)=「Y」Then'ENTER CODE ELSE END IF – user3561813 2015-01-21 03:46:26