【问题标题】:matching values in cells to Named ranges - vba将单元格中的值与命名范围匹配 - vba
【发布时间】:2018-01-14 03:26:13
【问题描述】:

我正在使用 VBA 尝试查看一个工作簿中单元格中的值是否与另一个工作簿中的命名范围匹配,如果它们匹配,则从这些命名范围中的另一列复制粘贴值。我知道他们会匹配。目的只是将值复制到其指定的命名范围中。

问题出在这一行:

If rng = ws2.Range("NamedRange") Then

下面是我的代码:

Sub Button4_Click()

Dim strFileName As String
Dim wb1 As Workbook
Dim ws1 As Worksheet
Dim wb2 As Workbook
Dim ws2 As Worksheet
Dim cell As Range
Dim rng As Range
Dim RangeName As String
Dim CellName As String


''Set wb2 = ActiveWorkbook
''Set ws2 = wb2.Sheet("Output")
''ws2.Range("D1:D12").Copy

''Set wb1 = ActiveWorkbook

strFileName = CreateObject("WScript.Shell").specialfolders("Desktop") & "\BAC GVP - Template_Update_121917.xlsm"

If Dir(strFileName) <> vbNullString Then
    Set wb1 = Workbooks.Open(strFileName)
Else
MsgBox "Sorry, the file does not exist on your Desktop at this time, please drop a copy to your Desktop from server!"
End If

''Set wb2 = ThisWorkbook
''Set ws2 = wb2.Sheets("Output")
''Set ws1 = wb1.Sheets("RVP Local GAAP")

''ws2.Range("D4:D12").Copy
''ws1.Range("G13:G21").PasteSpecial xlPasteValues

  ''RangeName = "myData"
  ''CellName = "G11:G83"

  ''Set cell = Worksheets("RVP Local GAAP").Range(CellName)
  ''ThisWorkbook.Names.Add Name:=RangeName, RefersTo:=cell

  ''RangeName = "NamedRange"
  ''CellName = "C4:C12"


Set wb2 = ThisWorkbook
Set ws2 = wb2.Sheets("Output")
Set ws1 = wb1.Sheets("RVP Local GAAP")

For Each rng In ws1.Range("CurrentTaxPerLocalGAAPProvision")
    If rng = ws2.Range("NamedRange") Then
    ws2.Range("ReportBalance").Copy
    ws1.Range("CurrentTaxPerLocalGAAPProvision").PasteSpecial xlPasteValues
    MsgBox "Values Copied Successfully"
End If
Next rng
MsgBox "Both Ranges do not have the same data"
End Sub

见下图 - 单元格 G29 被称为“GVP_Donations_CurrentTaxPerLocalGAAPProvision”...所以对于这个例子,我希望 $4,313 出现在单元格 G29 中

CurrentTaxPerLocalGAAPPprovision:

范围(“名称范围”):

【问题讨论】:

  • 名为NamedRange 的命名范围的地址是什么?是单细胞还是多细胞? (如果有多个单元格,则不能将单个值与数组进行比较。)
  • 命名范围有不同的名称,因此多个单元格具有不同的命名范围。例如)单元格 A - 命名范围“A” 单元格 b 命名范围 =“B”。然后我有一个包含值 A、B 等的表,我想检查表中的这些值是否与命名范围的名称匹配(如果有意义的话)。表中的值也是我将其命名为“NamedRange”的整列
  • '我将整个列命名为“NamedRange”' - 在这种情况下,rng = ws2.Range("NamedRange") 将不起作用 - VBA 不支持将标量与向量进行比较。你想在那个声明中做什么?您是要查看整个列是否与rng.Value 具有相同的值,还是要查看rng.Value 是否存在于列中的某个位置?
  • 我正在尝试比较名为 ("NamedRange") 的命名范围中的单元格值是否用作名为 (CurrentTaxPerLocalGAAPProvision) 的 rng 中的多个单元格中的命名范围。所以有多个单元格,我为所有单元格创建了命名范围,现在我试图比较(“NamedRange”)中单元格的值,以查看这些值是否作为(CurrentTaxPerLocalGAAPProvison)名称范围中的命名范围存在。抱歉,我在解释方面很糟糕,而且对 VBA 很陌生。
  • 因此,对于CurrentTaxPerLocalGAAPProvision 范围内的每个值,您想查看它是否作为值存在于NamedRange 范围内的任何位置,如果这些值中的 any CurrentTaxPerLocalGAAPProvision 范围匹配,您想用取自 ReportBalance 范围的值替换整个 CurrentTaxPerLocalGAAPProvision 范围。

标签: vba excel named-ranges


【解决方案1】:

你的台词

If rng = ws2.Range("NamedRange") Then

由于试图将rng 的值(例如"",当rng 指代单元格G29)与值数组(“NamedRange”中的值)进行比较而崩溃。 VBA 无法处理标量与向量的比较。但这不是你想要做的。


我相信,要做你想做的事,你可以用以下代码替换你的循环:

'Loop through all the values in NamedRange
For Each rng In ws2.Range("NamedRange")
    'Transfer the value from the next column to the appropriate range in the
    'destination sheet
    ws1.Range(rng.Value).Value = rng.Offset(0, 1).Value
Next
MsgBox "Values Copied Successfully"

如果只应复制“NamedRange”中的部分值,那么您可能需要进行一些测试以查看范围是否位于正确的目标区域中:

Dim dstRng As Range
'Loop through all the values in NamedRange
For Each rng In ws2.Range("NamedRange")
    Set dstRng = Nothing
    On Error Resume Next
    Set dstRng = ws1.Range(rng.Value)
    On Error GoTo 0
    'Check that the range exists in destination sheet
    If Not dstRng Is Nothing Then
        'Check that the range exists in the appropriate area
        If Not Intersect(dstRng, ws1.Range("CurrentTaxPerLocalGAAPProvision")) Is Nothing Then
           'Transfer the value from the next column to the appropriate range in the
           'destination sheet
           dstRng.Value = rng.Offset(0, 1).Value
        End If
    End If
Next
MsgBox "Values Copied Successfully"

【讨论】:

  • 太棒了!感谢负载..感谢您在这方面的支持。
  • 我可以再问一个问题吗?如果我想在某处添加一个消息框以让用户知道值已成功复制,我在哪里可以做到这一点?我试过把它放在 dstRng.Value = rng.Offset(0, 1).Value.. 之后,但是消息框一直出现不止一次。
  • @Clarisa 把它放在Next 语句之后。 (我以为您的原始代码在那里有一条消息,但是,重新查看问题代码,这些消息的位置没有多大意义。在Next 之后,您已完成复制,所以这是一个好地方说“我已经完成了 - 现在你可以做点什么了”。)已将其添加到答案的代码中。
  • 我能再问一个与此相关的问题吗?不确定我是否应该只写一个新问题,但是因为您在想直接联系之前帮助了我很多。如果目标工作表中不存在范围,我可以在哪里添加一个消息框,然后添加一个消息框,上面写着“xyz 失败了,3 个金额没有结转,或者类似的东西?只是这样我就知道它是否会失败以及哪些失败?我猜是某种尝试捕获??..提前致谢。
  • 最好提出一个新问题。 (但是,如果您使用我回答中的最后一段代码,我认为您需要的只是两个 Ifs 上的 Else 语句,并且在两个 Else 块中显示适当的消息 - 例如 @987654332 @ 和 MsgBox rng.Value &amp; " not in relevant section of 'RVP Local GAAP' sheet".)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多