excel vba vlookup引用不带名称的单独工作簿

excel vba vlookup引用不带名称的单独工作簿,excel,vba,Excel,Vba,我希望在一个工作簿中使用vlookup引用另一个工作簿而无需特定标识的代码 因此,我几乎每个月都要为大约20个不同的报告使用vlookup,我想将其自动化,但由于名称和其他类型的信息不同,我不能使用名称或索引 我查看了其他帖子,我看到的答案主要是引用了一个名字,或者不是一个名字,而是一个索引。因为每次我无法引用它们时,名称都会不同,所以这不会是一个自动化的过程。我在考虑找一些参考资料,比如“活动工作簿”,“活动工作簿”参考仅针对一个工作簿,但有一个工作簿将输入数据,还有一个工作簿将输入源数据。我

我希望在一个工作簿中使用vlookup引用另一个工作簿而无需特定标识的代码

因此,我几乎每个月都要为大约20个不同的报告使用vlookup,我想将其自动化,但由于名称和其他类型的信息不同,我不能使用名称或索引


我查看了其他帖子,我看到的答案主要是引用了一个名字,或者不是一个名字,而是一个索引。因为每次我无法引用它们时,名称都会不同,所以这不会是一个自动化的过程。我在考虑找一些参考资料,比如“活动工作簿”,“活动工作簿”参考仅针对一个工作簿,但有一个工作簿将输入数据,还有一个工作簿将输入源数据。

我相信您的问题在于,在学习基础知识之前,您已经开始寻找有用的代码片段。这是一个非常常见的问题,许多人的状况比你差得多。有许多在线Excel VBA教程。试试看;找到一个与你的学习风格相匹配的,然后完成它。比起在线教程,我更喜欢书。我参观了一个大图书馆;回顾了他们的Excel-VBA引物;借了最有希望的;在家里完成了我的评论,买了一个我最喜欢的作为永久参考

我需要您选择一个至少包含三个工作簿的文件夹,我称之为工作簿a、工作簿B和工作簿C。工作簿a必须启用宏,并且必须引用Microsoft运行时脚本库。至少一个工作簿应具有多个工作表。至少有一个工作表的第1行中应有值

DemoWbkWsht
复制到工作簿a中的新模块。在第49行中,将“SheetsMove.xlsm”替换为工作簿C的名称

打开工作簿B。转到“运行宏”并运行宏
DemoWbkWsht
。也就是说,在另一个工作簿中运行宏。宏
DemoWbkWsht
在文件夹中创建一个名为“DemoWbkWsht.txt”的文件。记录文件和宏,查看输出和我用于创建该输出的语句。我相信我已经证明了你需要知道的一切。必要时带着问题回来,但是,你自己能理解的越多,你的发展就越快

我特别希望大家注意以下几点:

  • ActiveWorkbook
    ThisWorkbook
  • 工作簿。打开更改
    活动工作簿
    ,但不打开
    此工作簿
  • 如何循环浏览打开的工作簿或创建 工作簿引用并循环它们
  • 如何循环浏览工作簿中的每个工作表
  • 每个工作簿如何具有
    ActiveSheet
    。这是上次保存工作簿时激活的工作表。这就是为什么我问这些工作簿是否有多个工作表。如果工作簿只有一个工作表,则该工作表必须是活动工作表
  • 如何查看任何打开工作簿中任何工作表中的任何单元格。我已使用此功能列出每个工作表第1行中的值。这些值是大多数工作表中的列标题。这是我的另一个问题:你能通过标题识别目标工作表吗?我怀疑您是否需要用户的帮助,我相信您的宏可以识别您需要访问的工作表
祝你好运

Option Explicit
Sub DemoWbkWsht()

  ' Needs reference to Microsoft Scripting Runtime library. See Tools->References.

  Dim ColCrnt As Long
  Dim ColLast As Long
  Dim DiagFile As TextStream
  Dim Fso As New FileSystemObject
  Dim InxWbk As Long
  Dim InxWsht As Long
  Dim Path As String
  Dim WbkA As Workbook
  Dim WbkB As Workbook
  Dim WbkC As Workbook
  Dim WbkCrnt As Variant

  ' Updating the screen while updating a worksheet is the easiest way of
  ' ensuring your macro takes FOREVER to run. ALWAYS include this statement
  ' even if you do not think it is necessary.
  Application.ScreenUpdating = False

  ' Create reference to workbook holding this macro
  Set WbkA = ThisWorkbook

  ' Record path of workbook holding macro.
  Path = ThisWorkbook.Path & "\"

  ' Create the text file to which diagnostic file will be output within
  ' the folder holding the workbook holding this macro
  Set DiagFile = Fso.CreateTextFile(Path & "DemoWbkWsht.txt", True, False)

  ' List open workbooks.  Identify workbook B.
  DiagFile.WriteLine "***** Workbooks open when macro started"
  For InxWbk = 1 To Workbooks.Count
    DiagFile.WriteLine "  " & Workbooks(InxWbk).Name
    If Workbooks(InxWbk).Name <> WbkA.Name Then
      Set WbkB = Workbooks(InxWbk)
    End If
  Next

  ' List special workbooks.
  DiagFile.WriteLine "***** Special workbooks"
  DiagFile.WriteLine "  ActiveWorkbook: " & ActiveWorkbook.Name
  DiagFile.WriteLine "    ThisWorkbook: " & ThisWorkbook.Name
  DiagFile.WriteLine "      Workbook A: " & WbkA.Name
  DiagFile.WriteLine "      Workbook B: " & WbkB.Name

  Set WbkC = Workbooks.Open(Filename:=Path & "SheetsMove.xlsm")

  DiagFile.WriteLine "***** Special workbooks  after open of workbook C."
  DiagFile.WriteLine "  ActiveWorkbook: " & ActiveWorkbook.Name
  DiagFile.WriteLine "    ThisWorkbook: " & ThisWorkbook.Name
  DiagFile.WriteLine "      Workbook A: " & WbkA.Name
  DiagFile.WriteLine "      Workbook B: " & WbkB.Name
  DiagFile.WriteLine "      Workbook C: " & WbkC.Name

  ' List worksheets in workbooks A, B and C
  For Each WbkCrnt In VBA.Array(WbkA, WbkB, WbkC)
    With WbkCrnt
      DiagFile.WriteLine "***** Worksheets in workbook """ & .Name & """"
      With WbkCrnt
        For InxWsht = 1 To .Worksheets.Count
          DiagFile.WriteLine PadL(InxWsht, 4) & " " & .Worksheets(InxWsht).Name
        Next
        DiagFile.WriteLine "  ActiveWorksheet: " & .ActiveSheet.Name
      End With
    End With
  Next

  ' List worksheets in workbooks A, B and C
  For Each WbkCrnt In VBA.Array(WbkA, WbkB, WbkC)
    With WbkCrnt
      DiagFile.WriteLine "***** Worksheets in workbook """ & .Name & """"
      For InxWsht = 1 To .Worksheets.Count
        DiagFile.WriteLine PadL(InxWsht, 4) & " " & .Worksheets(InxWsht).Name
      Next InxWsht
      DiagFile.WriteLine "  ActiveSheet: " & .ActiveSheet.Name
    End With  ' WbkCrnt
  Next WbkCrnt

  ' List values from row 1 of worksheets in workbooks A, B and C
  For Each WbkCrnt In VBA.Array(WbkA, WbkB, WbkC)
    With WbkCrnt
      DiagFile.WriteLine "***** Values, if any, from row 1 of each worksheet in workbook """ & .Name & """"
      For InxWsht = 1 To .Worksheets.Count
        With .Worksheets(InxWsht)
          DiagFile.WriteLine PadL(InxWsht, 4) & " Worksheet: " & .Name
          ColLast = .Cells(1, .Columns.Count).End(xlToLeft).Column
          For ColCrnt = 1 To ColLast
            If .Cells(1, ColCrnt).Value <> "" Then
              DiagFile.WriteLine Space(5) & ColCode(ColCrnt) & "1=" & .Cells(1, ColCrnt).Value
            End If
          Next ColCrnt
        End With  ' .Worksheets(InxWsht)
      Next InxWsht
    End With  ' WbkCrnt
  Next WbkCrnt

  WbkC.Close SaveChanges:=False

  DiagFile.Close

  Application.ScreenUpdating = True

End Sub
Function ColCode(ByVal ColNum As Long) As String

  Dim PartNum As Long

  '  3Feb12  Adapted to handle three character codes.
  ' 28Oct16  Renamed ColCode to match ColNum.

  If ColNum = 0 Then
    Debug.Assert False
    ColCode = "0"
  Else
    ColCode = ""
    Do While ColNum > 0
      PartNum = (ColNum - 1) Mod 26
      ColCode = Chr(65 + PartNum) & ColCode
      ColNum = (ColNum - PartNum - 1) \ 26
    Loop
  End If

End Function
Public Function PadL(ByVal Str As String, ByVal PadLen As Long, _
                     Optional ByVal PadChr As String = " ") As String

  ' Pad Str with leading PadChr to give a total length of PadLen
  ' If the length of Str exceeds PadLen, Str will not be truncated

  '   Sep15 Coded
  ' 20Dec15 Added code so overlength strings are not truncated
  ' 10Jun16 Added PadChr so could pad with characters other than space

  If Len(Str) >= PadLen Then
    ' Do not truncate over length strings
    PadL = Str
  Else
    PadL = Right$(String(PadLen, PadChr) & Str, PadLen)
  End If

End Function
选项显式
子DemoWbkWsht()
'需要引用Microsoft脚本运行库。请参见工具->参考。
暗冷如长
暗领一样长
将文件设置为文本流
将Fso设置为新的FileSystemObject
长时变暗
暗淡无光
将路径设置为字符串
将WbkA作为工作簿
将WbkB设置为工作簿
将WbkC设置为工作簿
作为变体的Dim WbkCrnt
'在更新工作表的同时更新屏幕是最简单的方法
'确保宏永远运行。始终包括此声明
“即使你认为没有必要。
Application.ScreenUpdating=False
'创建对包含此宏的工作簿的引用
设置WbkA=ThisWorkbook
'保存宏的工作簿的记录路径。
路径=此工作簿。路径&“\”
'创建将在其中输出诊断文件的文本文件
'保存包含此宏的工作簿的文件夹
设置DiagFile=Fso.CreateTextFile(路径&“DemoWbkWsht.txt”,True,False)
'列出打开的工作簿。识别工作簿B。
DiagFile.WriteLine“******宏启动时工作簿打开”
对于InxWbk=1的工作簿。计数
DiagFile.WriteLine“”&工作簿(InxWbk).Name
如果工作簿(InxWbk).Name WbkA.Name然后
设置WbkB=工作簿(InxWbk)
如果结束
下一个
'列出特殊工作簿。
DiagFile.WriteLine“******特殊工作簿”
DiagFile.WriteLine“ActiveWorkbook:&ActiveWorkbook.Name
DiagFile.WriteLine“ThisWorkbook:&ThisWorkbook.Name
DiagFile.WriteLine“工作簿A:”&WbkA.Name
DiagFile.WriteLine“工作簿B:”&WbkB.Name
设置WbkC=Workbooks.Open(文件名:=Path&“SheetsMove.xlsm”)
DiagFile.WriteLine“****打开工作簿C后的特殊工作簿。”
DiagFile.WriteLine“ActiveWorkbook:&ActiveWorkbook.Name
DiagFile.WriteLine“ThisWorkbook:&ThisWorkbook.Name
DiagFile.WriteLine“工作簿A:”&WbkA.Name
DiagFile.WriteLine“工作簿B:”&WbkB.Name
DiagFile.WriteLine“工作簿C:”&WbkC.Name
'在工作簿A、B和C中列出工作表
对于VBA.Array中的每个WbkCrnt(WbkA、WbkB、WbkC)
使用WbkCrnt
DiagFile.WriteLine“****工作簿”“和.Name&”“中的工作表”
使用WbkCrnt
对于InxWsht=1到.Worksheets.Count
DiagFile.WriteLine PadL(InxWsht,4)和“&”.Worksheets(InxWsht).Name
下一个
DiagFile.WriteLine“ActiveSheet:&.ActiveSheet.Name
以
以
下一个
'在wo中列出工作表