2015-01-20 138 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