如何遍历工作表范围内的每个单元格并根据正则表达式匹配解锁它们
How to iterate through each cell in a worksheet range and unlock them based on a Regex match
我已经尝试并未能找到一个函数的语法来循环遍历工作表中的每个单元格并将其地址与正则表达式匹配,并根据肯定匹配解锁单元格,但似乎 IXLCell 地址不能被转换为字符串?
这是我一直在使用的功能:
Private Function NeedsToBeUnlocked(cell As IXLCell) As Boolean
Dim returnValue = False
Dim address As String = CType(cell.Address, String)
Dim reg As Regex = New Regex("^B5|[CDEFGH][56]|H9|[CDEFGH]12|[CDEFGH]4[5-9]|[CDEFGH]5[012]|[GH]6[6-9]|[GH]78[0-7]|[GH]88|[GH]9[0,6-9]|H1[47]|H2[1278]$|H3[01347]|[BCDFGH]16[246]|[CDEFGH]15[789]|[CDEFGH]160|E16[24]|[GH]10[0-9]|[GH]11[012]|G129|[GH]13[01]|H11[789]|H12[012,6-9]|H13[289]|H14[0-5,78]$")
Dim match As Match = reg.Match(address)
If match.Success Then
returnValue = True
End If
Return returnValue
End Function
这是 For Each 循环。
显然语法不正确,但你明白我的意思。
For Each c As IXLCell In xlWS.Range("A1", "I177").Cells
If NeedsToBeUnlocked(c.Address) Then
c.Style.Protection.SetLocked(False)
End If
Next
这是我天真的尝试,不只是使用像这样的一系列直接语句。一定有更好的办法吧?
xlWS.Range("B5", "H5").Style.Protection.SetLocked(False)
xlWS.Range("C6", "H6").Style.Protection.SetLocked(False)
xlWS.Cell("H9").Style.Protection.SetLocked(False)
我不确定我是否理解正确你的问题,但循环遍历我经常使用的单元格的方法是:
For ic 1 to 5 ' i column - in range from A to E
For ir 1 to 20 ' i row
wSheet.Cells(ir, ic).Value = "Col=" & ic & " row=" & ir
Next ir
Nect ic
您的 NeedsToBeUnlocked
函数是使用 IXLCell
类型的参数声明的,但您使用 IXLAddress
类型的参数调用它。将您的呼叫更改为
If NeedsToBeUnlocked(c) Then
并在函数更改中将单元格地址作为字符串获取
Dim address As String = CType(cell.Address, String)
至
Dim address As String = cell.Address.ToString()
另一种不使用 RegEx 的方法是定义一个范围数组并循环这些范围:
Dim ranges As String() = { "B5:H5", "C6:H6", "H9", ... }
For Each range as String in ranges
xlWS.Range(range).Style.Protection.SetLocked(false)
Next
我已经尝试并未能找到一个函数的语法来循环遍历工作表中的每个单元格并将其地址与正则表达式匹配,并根据肯定匹配解锁单元格,但似乎 IXLCell 地址不能被转换为字符串? 这是我一直在使用的功能:
Private Function NeedsToBeUnlocked(cell As IXLCell) As Boolean
Dim returnValue = False
Dim address As String = CType(cell.Address, String)
Dim reg As Regex = New Regex("^B5|[CDEFGH][56]|H9|[CDEFGH]12|[CDEFGH]4[5-9]|[CDEFGH]5[012]|[GH]6[6-9]|[GH]78[0-7]|[GH]88|[GH]9[0,6-9]|H1[47]|H2[1278]$|H3[01347]|[BCDFGH]16[246]|[CDEFGH]15[789]|[CDEFGH]160|E16[24]|[GH]10[0-9]|[GH]11[012]|G129|[GH]13[01]|H11[789]|H12[012,6-9]|H13[289]|H14[0-5,78]$")
Dim match As Match = reg.Match(address)
If match.Success Then
returnValue = True
End If
Return returnValue
End Function
这是 For Each 循环。 显然语法不正确,但你明白我的意思。
For Each c As IXLCell In xlWS.Range("A1", "I177").Cells
If NeedsToBeUnlocked(c.Address) Then
c.Style.Protection.SetLocked(False)
End If
Next
这是我天真的尝试,不只是使用像这样的一系列直接语句。一定有更好的办法吧?
xlWS.Range("B5", "H5").Style.Protection.SetLocked(False)
xlWS.Range("C6", "H6").Style.Protection.SetLocked(False)
xlWS.Cell("H9").Style.Protection.SetLocked(False)
我不确定我是否理解正确你的问题,但循环遍历我经常使用的单元格的方法是:
For ic 1 to 5 ' i column - in range from A to E
For ir 1 to 20 ' i row
wSheet.Cells(ir, ic).Value = "Col=" & ic & " row=" & ir
Next ir
Nect ic
您的 NeedsToBeUnlocked
函数是使用 IXLCell
类型的参数声明的,但您使用 IXLAddress
类型的参数调用它。将您的呼叫更改为
If NeedsToBeUnlocked(c) Then
并在函数更改中将单元格地址作为字符串获取
Dim address As String = CType(cell.Address, String)
至
Dim address As String = cell.Address.ToString()
另一种不使用 RegEx 的方法是定义一个范围数组并循环这些范围:
Dim ranges As String() = { "B5:H5", "C6:H6", "H9", ... }
For Each range as String in ranges
xlWS.Range(range).Style.Protection.SetLocked(false)
Next