Select直到不等于范围
Select Until Not Equal Range
我有一千行 Excel 工作表,看起来像这样。
我在循环中遇到了困难。我需要做的是从第一个单元格(即“002”)和 select 开始,直到单元格不等于第一个单元格(在本例中为“007”之前的单元格)。然后复制(或剪切,因为下一个循环将从“007”开始)并将其粘贴到另一个工作簿。
我这里有我现有的代码。
Dim s_cell As Range
Dim c_cell As Range
Set s_cell = Range("AM2")
Do Until ActiveCell.Offset(1) <> s_cell
On Error Resume Next
c_cell = ActiveRange
Range(c_cell, AcitveCell.Offset(1)).Select
Loop
End Sub
如果我可以创建一个代码来自动化这个想法,它将最大限度地减少此工作负载所需的时间。
像这样计算与 ActiveCell
匹配的单元格数:
Sub SelectActiveCellMatches()
If Len(ActiveCell) = 0 Then Exit Sub
Dim Count As Long
Do
Count = Count + 1
Loop Until ActiveCell.Offset(Count).Value <> ActiveCell.Value
ActiveCell.Resize(Count).Select
End Sub
部分自动化:复制列组
- 这会将与所选内容的第一个单元格相等的所有底部连续单元格复制到剪贴板,但仅在选择最后一个单元格下方的单元格之后。
Option Explicit
Sub CopyColumnGroup()
Const ProcName As String = "CopyColumnGroup"
On Error GoTo ClearError
With Selection.Cells(1)
Dim cCell As Range: Set cCell = .Cells
Dim cValue As Variant: cValue = .Value
Do While cCell.Value = cValue
Set cCell = cCell.Offset(1)
Loop
cCell.Select
.Resize(cCell.Row - .Row).Copy
End With
ProcExit:
Exit Sub
ClearError:
Debug.Print "'" & ProcName & "' Run-time error '" _
& Err.Number & "':" & vbLf & " " & Err.Description
Resume ProcExit
End Sub
你可以循环检查下一个值是否相同:
Sub test()
Dim i As Long
Dim j As Long
Dim LR As Long
LR = Range("A" & Rows.Count).End(xlUp).Row
j = 2 'starting row of data
For i = 2 To LR Step 1
If Range("A" & i + 1).Value <> Range("A" & i).Value Then
'next value is different, target range would be
Debug.Print Range("A" & j & ":A" & i).Address
j = i + 1
End If
Next i
End Sub
这段代码的输出是:
$A:$A
$A:$A
$A
$A:$A
这些是您要复制或执行任何操作的连续值范围。请注意,即使该值只出现一次,它也能正常工作。要调用目标范围,请使用显示 Range("A" & j & ":A" & i)
的代码部分。这将采用所有以相同值开始和结束的连续单元格。
我有一千行 Excel 工作表,看起来像这样。
我在循环中遇到了困难。我需要做的是从第一个单元格(即“002”)和 select 开始,直到单元格不等于第一个单元格(在本例中为“007”之前的单元格)。然后复制(或剪切,因为下一个循环将从“007”开始)并将其粘贴到另一个工作簿。
我这里有我现有的代码。
Dim s_cell As Range
Dim c_cell As Range
Set s_cell = Range("AM2")
Do Until ActiveCell.Offset(1) <> s_cell
On Error Resume Next
c_cell = ActiveRange
Range(c_cell, AcitveCell.Offset(1)).Select
Loop
End Sub
如果我可以创建一个代码来自动化这个想法,它将最大限度地减少此工作负载所需的时间。
像这样计算与 ActiveCell
匹配的单元格数:
Sub SelectActiveCellMatches()
If Len(ActiveCell) = 0 Then Exit Sub
Dim Count As Long
Do
Count = Count + 1
Loop Until ActiveCell.Offset(Count).Value <> ActiveCell.Value
ActiveCell.Resize(Count).Select
End Sub
部分自动化:复制列组
- 这会将与所选内容的第一个单元格相等的所有底部连续单元格复制到剪贴板,但仅在选择最后一个单元格下方的单元格之后。
Option Explicit
Sub CopyColumnGroup()
Const ProcName As String = "CopyColumnGroup"
On Error GoTo ClearError
With Selection.Cells(1)
Dim cCell As Range: Set cCell = .Cells
Dim cValue As Variant: cValue = .Value
Do While cCell.Value = cValue
Set cCell = cCell.Offset(1)
Loop
cCell.Select
.Resize(cCell.Row - .Row).Copy
End With
ProcExit:
Exit Sub
ClearError:
Debug.Print "'" & ProcName & "' Run-time error '" _
& Err.Number & "':" & vbLf & " " & Err.Description
Resume ProcExit
End Sub
你可以循环检查下一个值是否相同:
Sub test()
Dim i As Long
Dim j As Long
Dim LR As Long
LR = Range("A" & Rows.Count).End(xlUp).Row
j = 2 'starting row of data
For i = 2 To LR Step 1
If Range("A" & i + 1).Value <> Range("A" & i).Value Then
'next value is different, target range would be
Debug.Print Range("A" & j & ":A" & i).Address
j = i + 1
End If
Next i
End Sub
这段代码的输出是:
$A:$A
$A:$A
$A
$A:$A
这些是您要复制或执行任何操作的连续值范围。请注意,即使该值只出现一次,它也能正常工作。要调用目标范围,请使用显示 Range("A" & j & ":A" & i)
的代码部分。这将采用所有以相同值开始和结束的连续单元格。