2015-12-07 3 views
1

Я пробовал и не смог найти синтаксис для функции, которая будет циклически перебирать каждую ячейку на листе и сопоставлять ее адрес с Regex, и разблокировать ячейку на основе положительного совпадения, но кажется, что адреса IXLCell не могут быть переданы в строки? Это функция Я работаю с:Как перебирать каждую ячейку в диапазоне рабочих листов и разблокировать их на основе соответствия Regex

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 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) 

ответ

1

Другой подход без использования регулярных выражений было бы определить массив диапазонов и петлю над ними:

Dim ranges As String() = { "B5:H5", "C6:H6", "H9", ... } 

For Each range as String in ranges 
    xlWS.Range(range).Style.Protection.SetLocked(false) 
Next 
0

Я не уверен, если я понимаю вас вопрос правильно, но способ петли через клетку я часто использую это:

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 
0

Вашей NeedsToBeUnlocked функции объявлена ​​с параметром типа IXLCell но вы называете это параметром типа IXLAddress. Изменение вызова

If NeedsToBeUnlocked(c) Then 

И чтобы получить адрес ячейки в виде строки в изменении функции

Dim address As String = CType(cell.Address, String) 

к

Dim address As String = cell.Address.ToString() 

 Смежные вопросы

  • Нет связанных вопросов^_^