Динамический диапазон в VBA - PullRequest
0 голосов
/ 01 ноября 2018

Мне трудно понять, как передать динамический диапазон в формулу.

Обычно у меня будет сценарий, в котором я знаю, в каком столбце будет находиться мой диапазон (пример ниже), где LR - количество строк в моем диапазоне.

Range("A1:A" & LR).FormulaR1C1 = ....some formula here

Проблема начинается, когда мне нужно динамически создать диапазон, используя (в моем случае) имя заголовка столбца. Я могу найти столбец по имени заголовка, получить номер столбца, преобразовать его в букву, но ни одно из пробованных решений не сработало.

Это то, что я использую, чтобы получить номер столбца:

Function getColumn(searchText As String, wsname As String) As Integer
    Set aCell = Sheets(wsname).Rows(1).Find(what:=searchText, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
        If aCell Is Nothing Then
            MsgBox ("Column was not found. Check spelling")
            Exit Function
        Else
            getColumn = aCell.Column
        End If
End Function

Этот код я использую для преобразования его в букву:

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

Теперь, чтобы заполнить формулу в диапазоне, я попробовал что-то подобное, но, к сожалению, не повезло:

colLetter = Col_Letter(manuallyAdjustedNumber)
Range(colLetter & "2:" & colLetter & LR).FormulaR1C1 = "=EXACT([RC-1],[" & harnessDrawingNumber & " - " & manuallyAdjustedNumber & "])"

Я буду признателен за любую помощь! Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы делаете этот способ слишком сложным. Почему вы используете нотацию R1C1 и в то же время конвертируете все обратно и обратно из букв столбцов в номера столбцов, я совершенно не знаю.

У вас 2 проблемы:

  • Вы всегда работаете с ActiveWorkbook (пример ниже делает это явным).
  • Необходимо убедиться, что Рабочий лист найден.

Это должно выглядеть примерно так:

Public Function GetColumn(searchText As String, wsname As String) As Integer
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        With ws
            If LCase$(.Name) = LCase$(wsname) Then
                Dim header As Range
                Set header = .Rows(1).Find(searchText, , xlValues, xlWhole, xlNext, False)
                If Not header Is Nothing Then
                    GetColumn = header.Column
                    Exit Function
                End If
                MsgBox ("Column was not found. Check spelling")
                Exit Function
            End If
        End With
    Next
    MsgBox "Worksheet '" & wsname & "' not found."
End Function
0 голосов
/ 01 ноября 2018

Забудьте о переходе на букву и просто используйте Cells

 With Worksheets("Sheet1")
    .Range(.Cells(2,manuallyAdjustedNumber),.Cells(LR,manuallyAdjustedNumber)).FormulaR1C1 = ...
End With
...