我有一个宏,我在其中遍历各列并确定“顶部”单元格(第7行,因为存在各种不相关的标头)是否与某些指定值匹配,然后执行各种操作。
问题在于某些标头是合并的单元格。这意味着代码只能正确识别与标题单元格跨越的最左列对齐的列。显然,我需要对此进行更改以解决此问题。
我不知道如何获取它来记录D列和E列的值,其中D列和E列中的合并单元格都显示“经理”或“导演”。
此刻,我刚刚添加了一个虚构的动作(“ y = 22”),因为我试图在前进之前弄清基本原理。
Sub LabourCalc()
Dim x As Variant
Dim y As Variant
Workbooks("XXX").Activate
Sheets("XXX").Activate
For x = 1 To 10
If InStr(Cells(7, x).Value, "MANAGER") _
Or InStr(Cells(7, x).Value, "manager") _
Or InStr(Cells(7, x).Value, "Manager") _
Or InStr(Cells(7, x).Value, "DIRECTOR") _
Or InStr(Cells(7, x).Value, "Director") _
Or InStr(Cells(7, x).Value, "director") Then
y = 22
End If
Next x
End Sub
答案 0 :(得分:2)
使用Range.MergeArea
属性。
返回一个Range对象,该对象表示包含指定单元格的合并范围。如果指定的单元格不在合并范围内,则此属性返回指定的单元格。
例如,如果D7:E7
是合并的单元格:
Cells(7, 4).MergeArea.Cells(1, 1)
是指D7
Cells(7, 5).MergeArea.Cells(1, 1)
也是指D7
。单元格E7
为空。如果F7
不是 一个合并的单元格:
Cells(7, 6).MergeArea.Cells(1, 1)
是指F7
。正如@ValonMiller在评论中指出的那样,您可以通过首先使用InStr
将Cells(7, x)
的内容转换为大写字母来简化多个UCase
实例。
您的最终循环如下:
With Workbooks("XXX").Sheets("XXX")
For x = 1 To 10
With .Cells(7, x).MergeArea.Cells(1, 1)
If InStr(UCase(.Value), "MANAGER") Or InStr(UCase(.Value), "DIRECTOR") Then
' Do your stuff here
End If
End With
Next x
End With
答案 1 :(得分:1)
所有这些评论,没有人提供实际的工作答案。试试这个:
Sub LabourCalc()
Dim wb as Workbook
Set wb = Workbooks("XXX")
Dim ws as Worksheet
Set ws = wb.Worksheets("XXX")
For x = 1 To 10
Select Case UCase$(ws.Cells(7,x).MergeArea.Cells(1,1))
Case is = "MANAGER","DIRECTOR"
'do stuff here
End Select
Next
End Sub
如果您需要检查Manager或Director是否出现在单元格中,请执行以下操作:
Dim checkValue as String
checkValue = UCase$(ws.Cells(7,x).MergeArea.Cells(1,1))
Select Case Instr(checkValue,"MANAGER") > 0 Or Instr(checkValue,"DIRECTOR") > 0
Case is = True
'do stuff
End Select