【问题标题】:Excel VBA select mulptiple cells based on selectionExcel VBA根据选择选择多个单元格
【发布时间】:2020-10-25 23:06:35
【问题描述】:

我想根据选择选择多个单元格。

这是我的代码:

Private Sub CommandButton1_Click()

Selection.EntireRow.Select

End Sub

我想选择多个单元格中的前四列,而不是整行。如何实现?

this is my Excel worksheet

【问题讨论】:

  • 试试ActiveSheet.Range(Range).Select
  • 我想你可以试试RANGE(A:D).Select。参考在这里docs.microsoft.com/en-us/office/vba/api/excel.range.select
  • 您可以使用RangeCells 的组合。如果您想动态选择某些特定范围,您可以使用 If-Then-Else 语句,该语句可能嵌套在 For-Next 循环或 [...]
  • [...] For Each-Next 循环并检查每个给定单元格的每个 Range.Value 属性。尽量避免使用 Select(当然,除非您的目标是实际选择某些东西)。您可能感兴趣的另一个属性是ResizeSelection.Resize(1,4).Select 可能是您真正想要的。

标签: excel vba


【解决方案1】:

选择非连续范围的行

  • 将代码复制到标准模块中,例如Module1.

  • 在您的命令按钮单击事件中,按以下方式使用任一过程名称:

    Private Sub CommandButton1_Click()
        selectRowsOfListObject
    End Sub
    

    Private Sub CommandButton1_Click()
        selectRowsOfFirstFourColumns
    End Sub
    
  • 第一个过程将仅选择ActiveSheet 中第一个(结构化)表中选定单元格的行。表格数据 (DataBodyRange) 之外的任何单元格都将被忽略。

  • 第二个过程将在ActiveSheet 的前四列中选择前四列中选定单元格的所有行范围。在前四列之外选择的任何单元格都将被忽略

  • 当代码将引用“包含”命令按钮的工作表时,每个或两个代码都可以与任何工作表上的命令按钮一起使用。

  • 如果您希望另一个工作表上的命令按钮始终引用第一个工作表,您宁愿创建对第一个工作表的引用:
    而不是

    Set ws = ActiveSheet
    

    使用例如

    Set ws = wb.Worksheets("Sheet1")
    
  • 为了更好地理解差异,您可以为第二个代码添加另一个命令按钮,然后测试它们中的每一个。

守则

Option Explicit

Sub selectRowsOfListObject()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim tbl As ListObject
    Set tbl = ws.ListObjects(1)
    If Selection.Worksheet.Name = ws.Name Then
        If TypeName(Selection) = "Range" Then
            Dim rng As Range
            Set rng = Intersect(Selection, tbl.DataBodyRange)
            If Not rng Is Nothing Then
                Set rng = Intersect(rng.Rows.EntireRow, tbl.DataBodyRange.Rows)
            End If
            If Not rng Is Nothing Then
                rng.Select
            End If
        End If
    End If
End Sub

Sub selectRowsOfFirstFourColumns()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim ws As Worksheet
    Set ws = ActiveSheet
    If Selection.Worksheet.Name = ws.Name Then
        If TypeName(Selection) = "Range" Then
            Dim rng As Range
            Set rng = Intersect(Selection.Rows.EntireRow, _
                                ws.Columns(1).Resize(, 4))
            If Not rng Is Nothing Then
                rng.Select
            End If
        End If
    End If
End Sub

【讨论】:

    【解决方案2】:

    检查此代码:

    Option Explicit
    Sub Rows_Selection()
    
    Dim rng As Range
    Dim active_cells_adress, row_no As Variant
    Dim final_selection_adress As String
    Dim rng1 As String
    Dim i As Integer
    Selection.EntireRow.Select
    
    Set rng = Selection
    rng1 = rng.Address
    
    
    final_selection_adress = ""
    active_cells_adress = Split(rng1, "$")
    For i = 2 To UBound(active_cells_adress)
      row_no = Split(active_cells_adress(i), ",")
      final_selection_adress = final_selection_adress + "A" & row_no(0) & ": D" & row_no(0) + ","
      i = i + 1
    Next
    
    final_selection_adress = Left(final_selection_adress, Len(final_selection_adress) - 1)
    Range(final_selection_adress).Select
    
    
    End Sub
    

    【讨论】:

    • 如果选中的单元格B2,它将选择B2:D2而不是A2:D2。如果选定的单元格B2C4A6,它将选择B2:D2而不是A2:D2A4:D4A6:D6
    • 没错,你说的是对的。根据屏幕截图,我认为该行的第一个单元格正在选择。我现在改变了答案
    • 哇,不错。如果您使用Option Explicit,这将迫使您调暗所有变量:Dim j As StringDim i As LongDim rng1 As StringDim n As Variant 并使用更好的变量名,尤其是对于字符串,那就太好了。无论如何,+1。做得好。您也可以执行Set rng = Selection.EntireRow 并删除Selection.EntireRow.Select。请参阅here 如何避免Select。当然,在最后一行你不能避免。
    • 谢谢,我已经更新了代码,包括你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多