【问题标题】:Storing headers in string array VBA将标题存储在字符串数组VBA中
【发布时间】:2015-01-21 10:40:57
【问题描述】:

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 中的 Col A 为空。

【问题讨论】:

  • 所以为了简化;您需要检查Sheet1中的E列是否为“Y”,如果是则将该行中的数据填充到Sheet2中的相应列?两个工作表中的列会始终保持不变,还是会发生变化?
  • 他们有改变的潜力。我更正了 sheet2 中的一列。

标签: arrays vba excel


【解决方案1】:

如何将标题存储在字符串数组中?

一个很实用的方法:

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循环遍历数组。

【讨论】:

  • 您可以跳过几个步骤,例如:HeaderList = Array("header1", "header2")
  • @DougGlancy - 是的。当数组中有很多元素时,我个人发现这更实用。这是一个品味问题。
  • 这回答了实际问题并澄清了他们所指的内容
【解决方案2】:

这是我整理的一段代码,我认为它可以满足您的需求。我认为变量名称是不言自明的,但如果不是,请跟进。

代码搜索原始工作表标题行中的每个单元格,以查看它是否存在于目标工作表中。如果是,则复制相应的信息。

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

【讨论】:

  • 我很伤心。从技术上讲,最佳答案是我发布的问题的答案。但是你用这个把它赶出了公园^^^。这是我项目的答案,只需要稍作调整。打算好好学习一下,以了解它是如何完成我几天来一直在尝试做的事情的。唯一没有做的就是在复制然后循环之前搜索“Y/N”列以查看 if = Y到工作表的底部。一旦我更了解这一点,我将添加这些调整。令人惊奇的是它的可扩展性。您甚至不需要知道任何标题名称即可完成这项工作。太棒了!
  • 谢谢!我想我会尽力帮助您解决根本问题。关于 Y/N 列:如果我正确理解了您的请求,单击按钮将触发此宏。单击后,该按钮将检查 Y/N 列是否确实为 Y?如果这是正确的,那么最简单的解决方案是将整个代码块包含在 IF / ELSE 语句中。例如,IF cells(Activecell.row, 5) = "Y" Then 'ENTER CODE ELSE END IF
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2016-03-17
  • 1970-01-01
  • 2010-11-11
  • 2023-03-13
相关资源
最近更新 更多