VBA выбирает столбец по имени после выбора. Поиск - PullRequest
0 голосов
/ 30 апреля 2018

У меня проблемы с тем, чтобы VBA выделил весь столбец по имени (может содержать несмежные данные) после поиска по столбцу.

' Select the first row
Rows("1:1").Select

Selection.Find(What:="LongColumnName", After:=ActiveCell, LookIn:= _
    xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=False, SearchFormat:=False).Activate
    Selection.End(xlUp).Select

Проблема в том, что после нахождения ячейки выборка остается целой строкой 1 . После того, как у меня есть выбранный столбец, я переместу его вперед и сделаю это для нескольких столбцов. Наконец, я вставлю столбцы и сделаю некоторое сравнение между значениями столбцов.

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы не должны Select и Activate диапазоны

Процесс перемещения столбцов может быть таким:


Option Explicit

Public Sub MoveColumns1()
   Const SDEL = "|||"    'column names cannot contain the delim chars ("|||")
   Const CN = "Col2" & SDEL & "Col1 `!@#$%^&*()_+-={}[];':"""",./<>?"

   Dim ws As Worksheet, cols As Variant, arr As Variant, newStart As Long, cnX As String
   Dim trim1 As String, trim2 As String, i As Long, j As Long, cn1 As String

   Set ws = Sheet1          'Or: Set ws = ThisWorkbook.Worksheets("Sheet1")
   cn1 = "Col3 - Line 1" & Chr(10) & "Col3 - Line 2" & Chr(10) & "Col3 - Line 3"
   cnX = cn1 & SDEL & CN    'Header with multiple lines of text, separated by Chr(10)
   cols = Split(cnX, SDEL)  '0-based array containing names defined in cnX
   arr = ws.Range(ws.Cells(1), ws.Cells(1, ws.Columns.Count).End(xlToLeft)) 'hdr row (1)

   Application.ScreenUpdating = False   'Turn screen Off
   For i = 1 To UBound(arr, 2)          'Iterate all Header cells (in row 1)
      trim1 = Trim$(arr(1, i))          'Trim left/right white-spaces from each Header
      For j = 0 To UBound(cols)         'Iterate each name defined in cnX
         trim2 = Trim$(cols(j))         'Trim left/right white spaces in current cnX
         If Len(trim1) >= Len(trim2) Then       'If Header is longer than current cnX
            If InStrB(1, trim1, trim2) > 0 Then 'If Header contains current cnX
               ws.Cells(i).EntireColumn.Cut         'Copy current cnX column (i)
               ws.Cells(1).Insert Shift:=xlToRight  'Paste column as first (1)

               newStart = Len(cnX) - (InStr(1, cnX, trim2) + Len(trim2) + Len(SDEL) - 1)
               If newStart < 1 Then Exit Sub    'If the cnX list is empty, we are done
               cols = Split(Right(cnX, newStart), SDEL)  'Remove current cnX
               Exit For                         'Done with current cnX
            End If
         End If
      Next
   Next
   Application.ScreenUpdating = False   'Turn screen back On
End Sub

Измените константу CN вверху, чтобы включить все столбцы, которые нужно переместить


До

Before

После

After


Примечание. Если имя столбца содержит несколько строк текста, к константе CN можно добавить только первую строку. Вы также можете определить имя каждого отдельного столбца с несколькими строками текста, как я определил его в переменной cn1

Это также работает:

Public Sub MoveColumns2()
   Const SDEL = "|||"    'column names cannot contain the delim chars ("|||")
   Const CN = "Col3 - Line 1" & SDEL & "Col2" & SDEL & "Col1 `!@#$%^&*()_+-={}[];':"""",./<>?"

   Dim ws As Worksheet, cols As Variant, arr As Variant, newStart As Long, cnX As String
   Dim trim1 As String, trim2 As String, i As Long, j As Long, cn1 As String

   Set ws = Sheet1          'Or: Set ws = ThisWorkbook.Worksheets("Sheet1")
   cnX = CN                 'Header with multiple lines of text, separated by Chr(10)
   cols = Split(cnX, SDEL)  '0-based array containing names defined in cnX
   arr = ws.Range(ws.Cells(1), ws.Cells(1, ws.Columns.Count).End(xlToLeft)) 'hdr row (1)

   Application.ScreenUpdating = False   'Turn screen Off
   For i = 1 To UBound(arr, 2)          'Iterate all Header cells (in row 1)
      trim1 = Trim$(arr(1, i))          'Trim left/right white-spaces from each Header
      For j = 0 To UBound(cols)         'Iterate each name defined in cnX
         trim2 = Trim$(cols(j))         'Trim left/right white spaces in current cnX
         If Len(trim1) >= Len(trim2) Then       'If Header is longer than current cnX
            If InStrB(1, trim1, trim2) > 0 Then 'If Header contains current cnX
               ws.Cells(i).EntireColumn.Cut         'Copy current cnX column (i)
               ws.Cells(1).Insert Shift:=xlToRight  'Paste column as first (1)

               newStart = Len(cnX) - (InStr(1, cnX, trim2) + Len(trim2) + Len(SDEL) - 1)
               If newStart < 1 Then Exit Sub    'If the cnX list is empty, we are done
               cols = Split(Right(cnX, newStart), SDEL)  'Remove current cnX
               Exit For                         'Done with current cnX
            End If
         End If
      Next
   Next
   Application.ScreenUpdating = False   'Turn screen back On
End Sub
0 голосов
/ 30 апреля 2018

Учитывая ваше описание, переданный вами код будет работать, если вы измените Activate на Select и xlUp на xlDown. Так бы это выглядело как

Rows("1:1").Select

Selection.Find(What:="LongColumnName", After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Select
Selection.End(xlDown).Select

Однако, если в этом столбце есть пустые строки, которые могут вызвать некоторые проблемы (поскольку в своем описании вы указали, что вы хотите выбрать весь столбец). Так что я бы пошел на следующее

Rows("1:1").Select

Selection.Find(What:="LongColumnName", After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).EntireColumn.Select
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...