2015-03-04 2 views
1

Возникли проблемы с этим кодом. Ошибок нет, но, похоже, ничего не делает. В моем листе столбец «M» имеет некоторые значения, начинающиеся с буквы «T». Я хочу выбрать для них всю строку. Заранее спасибо.VBA Excel - выберите строки с левым значением = в переменную

Sub trace1() 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If Left(Range("M" & i).Value, 1) = trace Then Rows("i:i").Select 
    Next i 
End Sub 
+0

Вы можете изменить '" i: i "' to 'i', но я не знаю, что это очень помогло бы. – pnuts

+0

_ @ Michale72688_ Я рекомендую использовать метод Union, как показано [здесь] (http://stackoverflow.com/questions/25785628/how-to-add-to-current-cell-selection-in-excel-vba), потому что ваш цикл выбирает только текущую позицию вместо диапазона кратных строк. – Zegad

ответ

2

Один из возможных способов ответить на этот вопрос, как написано:

Sub trace1() 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 

    Dim SelectedRows As Range 

    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If Not SelectedRows Is Nothing Then 
      If Left(Range("M" & i).Value, 1) = trace Then Set SelectedRows = Union(SelectedRows, Rows(i)) 
     Else 
      If Left(Range("M" & i).Value, 1) = trace Then Set SelectedRows = Rows(i) 
     End If 
    Next i 
    SelectedRows.Select 'Replace with .Copy if that's what you really wanted. 
End Sub 
+0

Спасибо, это работает отлично. Еще раз спасибо Porcupine911 – Michael72688

1

Если вы пытаетесь выбрать строку, присвоенный переменной "я", вы должны использовать:

Sub trace1() 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If Left(Range("M" & i).Value, 1) = trace Then Rows(i).Select 
    Next i 
End Sub 
+0

Это полезно. Когда он заканчивается, выбирается только последняя строка. Поэтому мне нужно, чтобы остальные строки были выбраны. Благодарю. – Michael72688

+0

После вашего '.Select', добавьте' False'. Это добавит каждый новый выбор к вашему выбору. Итак, 'Строки (i) .Выберите False' – Kyle

0

Выражение

Rows("i:i").Select 

выдает ошибку - Ряды() не будет распознавать текстовое значение «i: i» в качестве аргумента.

Rows(i).Select 

будет работать. Но он не будет делать ничего, что вы можете видеть, кроме последней строки следует выбрать, когда код будет завершен. Вы можете сделать все, что нужно сделать, до строк «T» на следующем шаге вашего кода, прежде чем перейти к шагу Next i.

EDIT: ОК, вы хотите, чтобы несколько строк были выбраны, когда код завершен. Это может быть сделано:

Dim RowsDescript As String 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If Left(Range("M" & i).Value, 1) = trace Then RowsDescript = RowsDescript & i & ":" & i & "," 
    Next i 

If Len(RowsDescript) > 0 Then 
    RowsDescript = Left(RowsDescript, Len(RowsDescript) - 1)  ' removes the last comma 
    Range(RowsDescript).Select 
End If 

То, что вы хотите, чтобы в конечном итоге является выражением, которое выглядит следующим образом:

Range("9:9,12:12,16:16").Select 

Как вы там есть, когда строка идентифицируется как имеющий «T ", который вы хотите в нем, добавьте номер строки и двоеточие и номер строки снова и запятую в строку RowDescript. Таким образом, в конце цикла вы получаете строку, имеющую

9:9,12:12,16:16, 

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

+0

Я не уверен, как это сделать. Я просто хочу выбрать (и скопировать) все строки, где значение в столбце M начинается с буквы T. – Michael72688

+0

Где вы хотите скопировать строку? Кроме того, когда вы говорите «начинается с буквы T», вы имеете в виду, что в ячейке в столбце M есть больше, чем буква T? Ваш код выше захватит T в ячейке, но не T12345, так как последний не равен T. Это тоже можно решить, если это то, что вам нужно. –

+0

Я хочу скопировать все строки в другую таблицу, но я сделаю это вручную. Поэтому я просто хочу выбрать и скопировать в буфер обмена. – Michael72688

0

1. «Т» не равно «т», чтобы удалить «чувствительность к регистру» требуется использовать LCase или UCase (случай малого или верхний регистр)

2.Rows ("I: «) заменен Row (I)

Sub trace1() 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If UCase(Left(Range("M" & i).Value, 1)) = UCase(trace) Then Rows(i).Select 
    Next i 
End Sub 

а также один комментарий, в финале будет выбрана только последняя строка в диапазоне, например, грести 1,5 и 10 будет начинаться с„Т“, так что на конец будет выбран только 10-й ряд

обновлен относительно вопросов в комментариях

это позволит вам выбирать строки, начинающиеся с «t» или «T», но этот метод позволяет выбрать не более 45 строк.

Sub Macro1() 
    Dim trace$, LR&, i&, Rng$ 
    trace = "T": Rng = "" 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If UCase(Left(Range("M" & i).Value, 1)) = UCase(trace) Then Rng = Rng & i & ":" & i & "," 
    Next i 
    Rng = Left(Rng, Len(Rng) - 1) 
    Range(Rng).Select 
End Sub 

использования копировать/вставить одну на одну строку, если вам необходимо скопировать строки из одного листа к другому, или сортировать диапазон и выберите диапазон от первой строки до последней строки, где начальное значение ячейки из «Т»

+0

Знаете ли вы, как я могу выбрать все строки с столбцом M, начиная с T? – Michael72688

+0

@ Michael72688 Да, см. Обновленное сообщение – Vasily

1

"Строки (" i: i ")" не будут работать. Попробуйте собрать все адреса всех диапазонов в одной строке и затем выбрать строку. Обратите внимание на запятую, которая разделяет каждый диапазон.

Sub trace1() 
    Dim sRange As String 
    Dim trace As String 
    trace = "T" 
    Dim LR As Long, i As Long 
    LR = Range("M" & Rows.Count).End(xlUp).Row 
    For i = 1 To LR 
     If Left(Range("M" & i).Value, 1) = trace Then sRange = sRange & "," & i & ":" & i 
    Next i 
    Range(Mid(sRange, 2)).Select 
End Sub 
1

с помощью AutoFilter, чтобы дать вам выбор, как есть, или фактический адрес

избегает медленных циклов

Sub trace2() 
    Dim strTrace As String 
    Dim strAddress 
    Dim rng1 As Range 

    strTrace = "T" 
    Set rng1 = Range([m1], Cells(Rows.Count, "M").End(xlUp)) 

    With rng1 
     .AutoFilter 1, strTrace & "*" 
     Set rng1 = rng1.Cells(1).Offset(1, 0).Resize(rng1.Rows.Count - 1, 1) 
     strAddress = rng1.SpecialCells(xlVisible).EntireRow.Address 
    End With 

    MsgBox "rows that start with " & strTrace & vbNewLine & strAddress 
    ActiveSheet.AutoFilterMode = False 

End Sub 
+0

Спасибо. Я должен буду помнить об этом в будущем. – Michael72688

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