VBA – 匹配包含字符的命令

我有以下vba代码:

Function countX(area_x As String, area_w As String) Dim Nr As Integer, count_x As Integer, Col_Ind Dim temp_area As Range For Nr = 10 To 1 Step -1 With Worksheets(CStr(Nr)) If WorksheetFunction.CountIf(.Range(area_w), "*w*") > 0 Then 'Find "w" in area_w Col_Ind = WorksheetFunction.Match("w", .Range(area_w)) MsgBox (Col_Ind) 'Reset numbers of "x" in area_w Set temp_area = .Range(.Cells(9, 4).Offset(0, Col_Ind), .Cells(9, 9)) count_x = count_x + WorksheetFunction.CountIf(temp_area, "*x*") Exit For Else count_x = count_x + WorksheetFunction.CountIf(.Range(area_x), "*x*") End If End With Next countX = count_x End Function 

我有10张 – 所有结构相同。

  • D9 – I9 =>用户shell设置“x”(如有必要)
  • K9 – P9 =>用户Shell设置“w”(如有必要)

我有另一个工作表(相同的工作表)作为概述。 在死亡页面上,我希望看到所有数字都是10张的“x”。

困难的部分是:

  • 在设置“w”之后只有“x”应该被计数。

例如:在表8中设置了“w”。 现在应该只从第8页(w之后)到第10个“x”。

图片例子:

在这里输入图像说明

计数的“x”的结果将是“2”,因为在设定的“w”之后有2个“x”

这是问题。 它只有在用户设置了“w”的情况下才起作用。 但“w / r”或“r / w”等不起作用。

为此我需要一个解决scheme:)

只有3种方法可以做到:

 Public Function countW(area_w As String) With Application.Caller.Parent.Range(area_w) Set countW = .Find("w*", .Cells(1, 1), xlValues, xlWhole, , xlNext, 0) If .Rows.Count - 1 Then countW = countW.Row - .Row + 1 Else countW = countW.Column - .Column + 1 End With End Function 

要么

 Public Function countW(area_w As String) With Application.Caller.Parent.Range(area_w) countW = Application.Match("w", Application.Transpose(.Parent.Evaluate("INDEX(LEFT(" & area_w & "),)")), 0) End With End Function 

要么

 Public Function countW(area_w As String) countW = Application.Match("w*", Application.Caller.Parent.Range(area_w), 0) End Function 

编辑
在我看来,你的“改变”看起来更像一个新的问题,而不是一个小小的更新(也应该作为一个新的问题)。 不过这次我会给你一个解决scheme。

 Public Function countX(area_x As String, area_w As String) As Long Dim i As Long, to_offset As Variant, x_rng As Range For i = 1 To 10 'upper loop for worksheets With Worksheets(i) to_offset = Application.Match("*w*", .Range(area_w), 0) If IsNumeric(to_offset) Then 'run only if there is a "w" found If .Range(area_x).Columns.Count > 1 Then 'just one row Set x_rng = Intersect(.Range(area_x), .Range(area_x).Offset(0, to_offset)) Else 'just one column Set x_rng = Intersect(.Range(area_x), .Range(area_x).Offset(to_offset)) End If If .Range(area_x).Cells.Count > to_offset Then 'not running if the "last" cell has the was as we cout only "after" it countX = countX + Application.CountIf(x_rng, "*x*") End If End If End With Next End Function 

如果按照它查找所有工作表的方式执行,那么这个代码也会执行:

 Public Function countX(area_x As String, area_w As String) As Long Dim ws For Each ws In ThisWorkbook.Worksheets If IsNumeric(Application.Match("*w*", Intersect(ws.Range(area_w), ws.Range(area_w).Offset(, -1)), 0)) Then countX = countX + Application.CountIf(Intersect(ws.Range(area_x), ws.Range(area_x).Offset(0, Application.Match("*w*", ws.Range(area_w), 0))), "*x*") End If Next End Function 

也许不是最好的解决scheme(我现在没有时间自己尝试一下),但是这样做的一个方法是循环遍历单元格,并在每个单元格上使用InStr(cell,“w”)> 0。 ..