как найти адрес столбца (только букву) в VBA и express функция столбцов с переменными? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь найти и заменить часть моей строки, используя VBA в определенном диапазоне. Например, всякий раз, когда мой код обнаружил слово «CL», я хочу заменить сигма-заголовки, начиная со следующего столбца, на «идеальную сигму». Но как мне найти букву в ячейке после того, как я нашел адрес ячейки, который содержит буквы и цифры? В то же время я также не уверен, что я express мои столбцы () правильно работают с переменными ...

Sub testing2()

Dim i As String
    Dim k As String
    Dim lastcolumn As Long
    Dim lastcolletter As String
    Dim firstcolletter As String
    Dim detailedcolletter As String
    Dim ra As Range

lastcolumn = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column

Dim ra As Range

Set ra = Worksheets("Data").Cells.Find(What:="CL", LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False)
    detailedcolletter = ra.Address 'detailedcolletter address = D2 here
    'how to extract just the letter here only?

  i = "Sigma"
k = "Ideal Sigma"

lastcolletter = Col_Letter(lastcolumn)
Columns("firstcolletter" & ":" & "lastcolletter").Replace What:=i, replacement:=k, LookAt:=xlPart, MatchCase:=False
'not sure whether i expressed columns() function with variables correctly here

End Sub


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

End Function

В настоящее время

enter image description here

Ожидается

enter image description here

Обновлен код

Sub testing2()

Dim i As String
    Dim k As String
    Dim lastcolumn As Long
    Dim lastcolletter As String
    Dim firstcolletter As String
    Dim detailedcolletter As String
    Dim ra As Range

    lastcolumn = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column

    Set ra = Cells.Find(What:="CL", LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)
        detailedcolletter = ra.Address 'detailedcolletter address = D4 here
        'how to extract just the letter here only?
        detailedcolletter = colLetter(ra.Column)

      i = "Sigma"
    k = "Ideal Sigma"

    lastcolletter = Col_Letter(lastcolumn)
    Columns("detailedcolletter" & ":" & "lastcolletter").Replace What:=i, Replacement:=k, LookAt:=xlPart, MatchCase:=False '<----type mismatch over here

    End Sub


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

End Function

Function colLetter(col As Long) As String
    colLetter = Split(Columns(col).Address(, 0), ":")(0)
End Function

последняя фотография enter image description here

текущий пи c

enter image description here

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Используйте range.offset, чтобы получить массив для замены, затем вы можете использовать range.replace, попробуйте это:

Sub Macro1()
Dim i as string, k as string,index as integer
i = "Sigma":k = "Ideal Sigma"
With ActiveSheet
Dim rng As Range
Index = .Cells.Find("CL").Column
    .Columns(Index).Resize(, .Cells.Find("*", SearchOrder:=2, SearchDirection:=xlPrevious) _
    .Column - Index + 1).Replace What:=i, Replacement:=k, LookAt:=xlPart
End With
End Sub
1 голос
/ 25 марта 2020

Вот переписывание вашего кода. Большинство свойств Find не являются строго необходимыми, потому что они просто повторяют значения по умолчанию, но я на самом деле не только хотел бы, чтобы они были в моем коде, но даже перечислял их ясно (для удобства чтения), чтобы я знал, что было установлено без обратитесь к руководству MSDN для определения по умолчанию.

Sub testing2()

    Dim Fnd As Range

    With Worksheets("Data")
        Set Fnd = .Rows(1).Find(What:="CL", _
                                LookIn:=xlFormulas, _
                                LookAt:=xlPart, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False, _
                                SearchFormat:=False)

        If Not Fnd Is Nothing Then
            Set Fnd = .Range(Fnd.Offset(0, 1), .Cells(1, Columns.count).End(xlToLeft))
            Fnd.Replace What:="Sigma", _
                        Replacement:="ideal Sigma", _
                        LookAt:=xlPart, _
                        SearchOrder:=xlByRows, _
                        MatchCase:=False, _
                        SearchFormat:=False, _
                        ReplaceFormat:=False
        End If
    End With
End Sub
1 голос
/ 25 марта 2020

Чтобы ответить на ваш вопрос, вы можете использовать следующую функцию

Function colLetter(col As Long) As String
    colLetter = Split(Columns(col).Address(, 0), ":")(0)
End Function

В вашем случае вам нужно вызвать функцию со свойством столбца

Sub Testit()
    Dim rg As Range
    Set rg = Range("D2")
    Debug.Print colLetter(rg.Column)
End Sub

В вашем коде тогда

detailedcolletter = colLetter(ra.Column)

PS Можно исправить ваш код следующим образом (не требуется указанная выше функция)

Sub testing2()

    Dim i As String
    Dim k As String
    Dim lastcolumn As Long

    Dim ra As Range
    Dim hdrRow As Long



    Set ra = Cells.Find(What:="CL", LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)

    hdrRow = ra.Row - 1
    lastcolumn = Worksheets("Data").Cells(hdrRow, Columns.Count).End(xlToLeft).Column

    i = "Sigma"
    k = "Ideal Sigma"

    Dim wks As Worksheet

    Set wks = Worksheets("Data")
    With wks
        .Range(.Cells(hdrRow, ra.Column + 1), .Cells(hdrRow, lastcolumn)).Replace What:=i, replacement:=k, LookAt:=xlPart, MatchCase:=False
    End With

End Sub

PS2 Обновлен код добавив переменную для строки заголовка. Пожалуйста, имейте в виду, что в коде все еще есть некоторые подводные камни, о которых вам нужно позаботиться, так как, например, код создаст sh, если на листе вообще нет CL или он находится в строке 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...