Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 是否打开具有特定名称模式的不同文件夹和工作表?_Excel_Vba - Fatal编程技术网

Excel 是否打开具有特定名称模式的不同文件夹和工作表?

Excel 是否打开具有特定名称模式的不同文件夹和工作表?,excel,vba,Excel,Vba,我正在尝试编写一个VBA代码,允许我选择多个excel文件,并根据文件名导入数据。例如,如果有两个excel文件具有相同的名称前缀,例如名称以N开头。它应该打开并导入数据,但是如果名称前缀存在一次,它应该忽略该文件。 我编写以下代码来迭代工作簿集合并提取工作表名称,但是在第二次迭代中,它只迭代一次,数组超出范围错误显示。我们非常感谢您的任何建议或帮助 Sub import() Dim shName1 As Worksheet Dim shName2 As Worksheet Dim

我正在尝试编写一个VBA代码,允许我选择多个excel文件,并根据文件名导入数据。例如,如果有两个excel文件具有相同的名称前缀,例如名称以N开头。它应该打开并导入数据,但是如果名称前缀存在一次,它应该忽略该文件。 我编写以下代码来迭代工作簿集合并提取工作表名称,但是在第二次迭代中,它只迭代一次,数组超出范围错误显示。我们非常感谢您的任何建议或帮助

      Sub import()
Dim shName1 As Worksheet
Dim shName2 As Worksheet
Dim FileToOpen As Variant
Dim FileName As String
Dim selectedBook As Workbook
Dim selectedBook2 As Workbook
Dim i As Byte  ''
Dim FileCnt As Long

'On Error GoTo Handle:
 ' Pick only excel files to import and allow multipleselection
 FileToOpen = Application.GetOpenFilename(Filefilter:="Excel Files (*.xlsx), *.xlsx", Title:="Select Workbook to Import", MultiSelect:=True)
    If IsArray(FileToOpen) Then
        For FileCnt = LBound(FileToOpen) To UBound(FileToOpen)
            Set selectedBook = Workbooks.Open(FileName:=FileToOpen(FileCnt))
            Set shName1 = selectedBook.Worksheets(FileCnt)
            For i = FileCnt + 1 To UBound(FileToOpen) - 1
                Set shName2 = selectedBook.Worksheets(i)
                If shName1 <> shName2 Then
                    'do samething
                Else:
                    ' do otherthing
                MsgBox shName2.Name
            Next i '
        Next FileCnt '
    End If 'is Array
子导入()
将shName1设置为工作表
将shName2设置为工作表
Dim FileToOpen作为变体
将文件名设置为字符串
将所选书本设置为工作簿
将所选书本2设置为工作簿
Dim i作为字节“”
将文件变长
'在错误转到句柄时:
'仅选择要导入的excel文件并允许多次选择
FileToOpen=Application.GetOpenFilename(Filefilter:=“Excel文件(*.xlsx),*.xlsx”,Title:=“选择要导入的工作簿”,MultiSelect:=True)
如果是IsArray(FileToOpen),那么
对于FileCnt=LBound(FileToOpen)到UBound(FileToOpen)
设置selectedBook=Workbook.Open(文件名:=FileToOpen(FileCnt))
Set shName1=selectedBook.Worksheets(FileCnt)
对于i=FileCnt+1到UBound(FileToOpen)-1
Set shName2=selectedBook.Worksheets(i)
如果shName1 shName2,则
“做同样的事
其他:
“做别的事吧
MsgBox shName2.Name
接下来我会
下一个文件
“如果”是数组,则结束
端接头

流放文件如下所示:

  • TB安全20BV.xlsx
  • 轴颈20BV.xlsx
  • TB安全19BV.xlsx
  • 日记账19BV.xlsx
  • TB安全21BV.xlsx 我只想使用对名称(如20或19)来跟踪数据,但21是单个的,因此我不导入它。每个工作簿中都有一个工作表
    为了在工作簿及其工作表之间进行迭代,请尝试使用下一个代码。如果您需要根据床单名称对其进行处理,请更准确地说明您需要什么

    Sub WorkbooksAndSheetsIteration()
      Dim FileToOpen As Variant, FileCnt As Long, sh As Worksheet, selectedBook As Workbook
      FileToOpen = Application.GetOpenFilename(Filefilter:="Excel Files (*.xlsx), *.xlsx", _
                                        Title:="Select Workbook to Import", MultiSelect:=True)
            If IsArray(FileToOpen) Then
            For FileCnt = LBound(FileToOpen) To UBound(FileToOpen)
                Set selectedBook = Workbooks.Open(fileName:=FileToOpen(FileCnt))
                For Each sh In selectedBook.Sheets
                    For shNo = 1 To selectedBook.Sheets.Count - 1
                        If left(sh.Name, 1) = left(selectedBook.Sheets(i).Name, 1) And _
                                                                      sh.Index <> i Then
                            boolOK = True: Exit For
                        End If
                    Next
                Next
                If boolOK Then
                    'do here the operation you need
                    '...
                Else
                     selectedBook.Close False
                End If
                boolOK = False
            Next FileCnt
        End If
    End Sub
    

    谢谢我想对这些工作表做的是,在fileToOpen数组中进行迭代,并根据工作表名称的第一个字母对照第二个工作表进行检查,如果它们的名称相同,我可以导入工作表中的所有数据。但是如果它们的第一个字母在其他文件中不存在,则忽略该文件,意味着不导入数据。您是在谈论工作簿的“名称前缀”还是工作表的“名称前缀”?换句话说,您写了一些关于工作簿的内容,在代码中尝试了一些与工作表名称相关的内容。即使你这样做的方式很奇怪。。。你能澄清一下这方面吗?我指的是工作表的名称。根据他们的名字,我想决定是否导入数据。好的。从这个角度来看,我将根据我的理解修改代码…@abraham foto:修改我的答案代码。它适合你的需要吗?
    Sub WorkbooksAndSheetsIterationBis()
      Dim FileToOpen As Variant, FileCnt As Long, sh As Worksheet, selectedBook As Workbook
      Dim shNo As Long, boolOK As Boolean, i As Long, wName As Variant, strN As String, strN2 As String
      FileToOpen = Application.GetOpenFilename(Filefilter:="Excel Files (*.xlsx), *.xlsx", _
                                        Title:="Select Workbook to Import", MultiSelect:=True)
            If IsArray(FileToOpen) Then
                For Each wName In FileToOpen
                    strN = Split(wName, "BV.xlsx")(0)
                    Debug.Print Right(strN, Len(strN) - InStrRev(strN, " ")): Stop
                    For FileCnt = LBound(FileToOpen) To UBound(FileToOpen)
                        strN2 = Split(FileToOpen(FileCnt), "BV.xlsx")(0)
                        If Right(strN, Len(strN) - InStrRev(strN, " ")) = _
                                Right(strN2, Len(strN2) - InStrRev(strN2, " ")) Then
                                boolOK = True: Exit For
                        End If
                    Next
                    If boolOK Then
                        Set selectedBook = Workbooks.Open(fileName:=FileToOpen(wName))
                        'do here the operation you need
                        '...
                    End If
                    boolOK = False
                Next
            End If
    End Sub