Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 VBA将多个选定Excel文件中的数据编译为一个分析文件_Vba_Excel - Fatal编程技术网

Excel VBA将多个选定Excel文件中的数据编译为一个分析文件

Excel VBA将多个选定Excel文件中的数据编译为一个分析文件,vba,excel,Vba,Excel,我编写了一个宏,用于打开所选文件,搜索发生错误的位置,然后将其放置在活动单元格的摘要文件中。它的工作非常完美,但现在我希望不是一个接一个地选择每个文件,而是我可以一起选择所有需要的文件,或者我可以打开一个文件,它一直运行到最后一个文件,因为文件名是串联的,即马达21、马达22等等。在这篇文章中有一些帮助,但我不知道我是否能使用它 子输入数据() Dim fNameAndPath作为变量 将wb设置为工作簿,将临时wb设置为工作簿 暗橙色作为范围,aCell作为范围,bCell作为范围 将ws设

我编写了一个宏,用于打开所选文件,搜索发生错误的位置,然后将其放置在活动单元格的摘要文件中。它的工作非常完美,但现在我希望不是一个接一个地选择每个文件,而是我可以一起选择所有需要的文件,或者我可以打开一个文件,它一直运行到最后一个文件,因为文件名是串联的,即马达21、马达22等等。在这篇文章中有一些帮助,但我不知道我是否能使用它

子输入数据()
Dim fNameAndPath作为变量
将wb设置为工作簿,将临时wb设置为工作簿
暗橙色作为范围,aCell作为范围,bCell作为范围
将ws设置为工作表
Dim SearchString作为字符串,DateCol作为字符串
双份孜然点心,双份柜台,双份cum
Dim strSheetName作为字符串,CellName作为字符串
将最后一列变长
设置wb=ThisWorkbook
strSheetName=ActiveSheet.Name
CellName=ActiveCell.Address
cum=范围(CellName).偏移量(-1,2).值
fNameAndPath=Application.GetOpenFilename(标题:=“选择要打开的文件”)
如果fNameAndPath=False,则退出Sub
设置临时wb=Workbooks.Open(fNameAndPath)
设置ws=ActiveSheet
设置橙色=宽度范围(“C:C”)
SearchString=“10000”
设置aCell=oRange.Find(What:=SearchString,LookIn:=xlValues_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlPrevious_
MatchCase:=False,SearchFormat:=False)
如果不是aCell,则“首次搜索代码ID字符串”
aCell.选择
DateCol=aCell.Offset(0,-2)
计数器=aCell.Offset(0,-1)
wb.工作表(strSheetName).Range(CellName)=DateCol
wb.工作表(strSheetName).Range(CellName).Offset(0,1)=计数器
总和=计数器+总和
wb.工作表(strSheetName).Range(CellName).Offset(0,2)=总和
wb.工作表(strSheetName).范围(CellName).偏移量(0,3)=“1000000”
wb.工作表(strSheetName).范围(CellName).偏移量(0,4)=“50”
lastColumn=ws.UsedRange.Columns.Count
如果InStr(1,ActiveCell.End(xlToRight).Offset(1,3).Value,“1ms”,vbTextCompare)为0,则
wb.Worksheets(strSheetName).Range(CellName).Offset(0,6)=ActiveCell.End(xlToRight).Offset(1,3)
wb.Worksheets(strSheetName).Range(CellName).Offset(0,7)=ActiveCell.End(xlToRight).Offset(1,4)
其他的
wb.Worksheets(strSheetName).Range(CellName).Offset(0,6)=Application.InputBox(“输入错误”,“对话框”,ActiveCell.End(xlToRight).Offset(1,3),,,,2)
wb.Worksheets(strSheetName).Range(CellName).Offset(0,7)=Application.InputBox(“输入错误”,“对话框”,ActiveCell.End(xlToRight).Offset(1,4),,,,2)
如果结束
其他的
MsgBox SearchString&“未找到”
出口接头
如果结束
临时wb.Close savechanges:=False
端接头
具有可选的multiselect参数

处理返回值可能为False或文件名和路径数组(即使该数组是一个文件名/路径数组)有点棘手。下面是一些框架,应该可以帮助您开始

Sub collect_fns()
    Dim f As Long, fNameAndPath As Variant

    fNameAndPath = Application.GetOpenFilename("Excel files (*.xl*), *.xl*", _
                        Title:="Select File(s) To Be Opened", MultiSelect:=True)

    If IsArray(fNameAndPath) Then
        For f = LBound(fNameAndPath) To UBound(fNameAndPath)
            ' do something with each file as fNameAndPath(f)
            process_each_fn CStr(fNameAndPath(f))
        Next f
    Else
        'no files selected
    End If

End Sub

Sub process_each_fn(fn As String)

    Debug.Print fn

End Sub

将大部分代码移动到另一个子模块,并通过循环将文件名传递到新子模块,这可能会有所帮助,正如我在上面演示的那样。

您尝试过什么来获得新的期望结果?丢弃代码并要求我们为您拼凑出一个解决方案可能不会有成效。
Sub collect_fns()
    Dim f As Long, fNameAndPath As Variant

    fNameAndPath = Application.GetOpenFilename("Excel files (*.xl*), *.xl*", _
                        Title:="Select File(s) To Be Opened", MultiSelect:=True)

    If IsArray(fNameAndPath) Then
        For f = LBound(fNameAndPath) To UBound(fNameAndPath)
            ' do something with each file as fNameAndPath(f)
            process_each_fn CStr(fNameAndPath(f))
        Next f
    Else
        'no files selected
    End If

End Sub

Sub process_each_fn(fn As String)

    Debug.Print fn

End Sub