【问题标题】:Copying range of cells from workbooks based on sheetname根据工作表名称从工作簿复制单元格范围
【发布时间】:2017-03-02 18:57:56
【问题描述】:

我昨天收到了有关此代码的帮助,但我对 VBA 完全陌生,所以我遇到了困难。解释我的代码:

我正在尝试将一个工作簿中的一系列单元格复制到另一个工作簿中的相同单元格区域,但工作表的名称必须相同。所以代码应该测试工作表是否存在,然后它会在两个工作簿中找到相应的工作表。如果名称相同,它将采用该值,但如果不是,它将继续遍历 workbook1 中的所有工作表以找到正确的工作表。代码运行通过,但它没有复制单元格。

我认为问题可能源于第一个循环中的 sheetexists 行。有人告诉我,我需要确保在运行循环之前检查工作表是否存在,但我不确定该怎么做。

谢谢!

Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

     If wb Is Nothing Then Set wb = ThisWorkbook
     On Error Resume Next
     Set sht = wb.Sheets(shtName)
     On Error GoTo 0
     SheetExists = Not sht Is Nothing

End Function
Sub foo()

Dim wbk1 As Workbook
Dim wbk2 As Workbook
Dim shtName1 As String
Dim shtName2 As String
Dim i As Integer
Dim p As Integer


Set wkb1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx")
Set wkb2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx")


i = 2
p = 2
shtName2 = wkb2.Sheets(i).Name
shtName1 = wkb1.Sheets(p).Name

For i = 2 To wkb2.Worksheets.Count
    If (SheetExists(shtName2) = True) And (SheetExists(shtName1) = True) Then
        For p = 2 To wkb1.Worksheets.Count
            If shtName2 = shtName1 Then
                wkb2.Sheets(shtName2).Range("D2:G2").Value = wkb1.Sheets(shtName1).Range("D2:G2").Value
            End If
        Next p
    End If
Next i

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您设置了shtName2 = wkb2.Sheets(i).Name,但之后再也不会更改它。所以它总是只看一张纸。

    您的foo 子程序应更改为:

    Sub foo()
        Dim wbk1 As Workbook
        Dim wbk2 As Workbook
        Dim i As Integer
    
        Set wbk1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx")
        Set wbk2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx")
    
        For i = 2 To wbk2.Worksheets.Count
            If SheetExists(wbk2.Worksheets(i).Name, wbk1) Then
                wbk2.Worksheets(i).Range("D2:G2").Value = wbk1.Worksheets(wbk2.Worksheets(i).Name).Range("D2:G2").Value
            End If
        Next i
    
    End Sub
    

    Option Explicit 作为代码模块的第一行也是一个好主意。我的回答中有错别字,因为我复制/粘贴了您的原始代码,但您定义了变量 wbk1wbk2 然后使用 wkb1wkb2 代替。由于wkb1wkb2 没有显式声明,它们被隐式创建为Variant,然后导致代码中出现问题,该问题预期Workbook

    Option Explicit 指示编译器强制您显式声明所有变量,从而识别出此类拼写错误。

    【讨论】:

    • 我明白你在做什么。它给了我一个 ByRef Argument mismatch 错误与以下行:SheetExists(wkb2.worksheets(i).Name, wkb1),它突出显示了 wkb1 我确实注意到 shtname 在该循环中没有改变。这更有意义
    • 对不起 - 错别字(“wkb”而不是“wbk”) - 将修复答案
    • @leetontea - 我弄清楚了为什么我有错别字。请参阅我添加到答案末尾的评论。
    • 我不敢相信我没有发现那个错字...谢谢!你帮了我很多。欣赏它
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多