我知道这是一个公然的求助帖子,但是我已经被赋予了这项任务,但我不知道如何及时完成它。
我对 Excel 有一定的了解,但不懂 VBA。我学过 C++,所以我理解代码,尤其是代码背后的逻辑。
需要完成的任务是:我们是一家销售益智玩具的小型初创公司。总共有 8 种产品。所以显然没有人记录我们按商品销售的商品。我们有超过 200 张列出每笔交易的发票。现在我需要一种方法来在所有这些文件中搜索文本字符串,例如“超级用户”,然后为我提供旁边列中的数字(用于特定格式的发票)和右侧第 3 列(如果使用 vlookup,则为列索引号 4)中的数字(用于另一种格式)。是的,出于某种原因,我们有两种格式。我可以将这两种格式分成不同的文件夹。
有什么方法可以做到这一点,而不必手动打开每个文件然后进行记录?
dit:所有文件都是 excel,它们看起来像这样https://i.stack.imgur.com/nk09x.jpg(不幸的是,这是一个 pdf 导出,我目前无法访问原始内容)图片我需要的是,如果要找到的字符串是 EDGE - Jungle Safari,那么我需要值 64 和值 10。基本上是相应行中 QTY 下的值。
答案1
初始设置
我构建了一个小示例,应该可以帮您找到所需的内容。首先,我在一个文件夹中设置了几个 excel 文件,其中一些包含字符串“abc”,而另一些则不包含。我将一些包含不止“abc”的文件放在同一个工作簿中的不同工作表中。这应该可以准确模拟您所拥有的内容。
向您展示完成后的工作原理
您必须提供初始目录,就像我在单元格 A2 中提供的一样。
编码
我们最初设置了一个循环来遍历所有 excel 文件,代码如下:
fileName = Dir(directory & "*.xl??")
找到每个文件名后,我们使用以下命令打开它:
Dim wbk As Workbook
With wbk
Set wbk = Workbooks.Open(directory & fileName)
End With
打开每个工作簿时,我们使用 cells.find 命令搜索字符串并在每个工作表中执行此操作。如果匹配,则将变量计数器增加一:
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
count = count + 1
Else
End If
Next sh
最后,请确保在转到下一个工作簿之前关闭每个工作簿,这样我们就不会出现打开太多工作簿而导致的内存问题:
wbk.Close
以下是所有代码:
Sub LoopThroughFiles()
Range("'Sheet1'!A6:A10000").ClearContents
Dim directory As String, fileName As String, sheet As Worksheet, i As Integer, j As Integer
directory = "C:\Users\wzcj9x\Desktop\New folder\"
fileName = Dir(directory & "*.xl??")
i = 5
Do While fileName <> ""
i = i + 1
If fileName <> "" Then
Dim wbk As Workbook
With wbk
Set wbk = Workbooks.Open(directory & fileName)
End With
Dim sh As Worksheet
Dim found As Range
Dim count As Integer
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
count = count + sh.Range(found.Address).Offset(0, 3).Value
Else
End If
Next sh
wbk.Close
End If
fileName = Dir()
Loop
Range("'Sheet1'!C2").Value = count
End Sub
您只需运行宏,它就会为您生成计数。如果您只想为每个工作簿生成 1 个计数,而不管它在工作簿中存在多少次,那么修改我的计数方法应该非常容易。
如果您有任何疑问,请告诉我,但希望这至少能帮助您走上正确的道路。
更新
我更新了我的问题,返回找到的单元格右侧 3 个单元格的值,并将它们全部相加。这与提问者的新更新相符。
根据评论进行另一次更新
我修改了代码,只对每个工作簿符合条件的最大值求和,然后将这些值相加:
Dim max As Integer
max = 0
For Each sh In wbk.Worksheets
Set found = sh.Cells.Find(what:="abc", LookIn:=xlFormulas)
If Not found Is Nothing Then
sh.Activate
found.Select
If sh.Range(found.Address).Offset(0, 3).Value > max Then
max = sh.Range(found.Address).Offset(0, 3).Value
End If
Else
End If
Next sh
count = count + max
wbk.Close