【问题标题】:Clear contents of cells in VBA using column reference使用列引用清除 VBA 中单元格的内容
【发布时间】:2013-11-04 19:28:54
【问题描述】:

我正在尝试使用列引用获取一段代码来清除某些单元格中的数据。我正在使用以下代码:

Worksheets(sheetname).Range(.Cells(2, LastColData), .Cells(LastRowData, LastColData)).ClearContents

为此,我在第一个 .Cells 部分收到错误,这是为什么呢?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    在此之前您需要一个 With 声明。或者把 .Cells 变成 Cells

    【讨论】:

    • 我尝试删除 .在每个单元格获取此Worksheets(sheetname).Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents 之前,我收到错误“应用程序定义错误或对象定义错误”。当使用 WITH 时应该去哪里?
    【解决方案2】:

    您可以使用Worksheet.Columns 对象将整个列作为范围访问

    类似:

    Worksheets(sheetname).Columns(1).ClearContents 
    

    应该清除A列的内容

    如果您需要对行执行类似操作,还有 Worksheet.Rows 对象


    您收到的错误可能是由于缺少 with 块。

    您可以在此处阅读有关块的信息:Microsoft Help

    【讨论】:

      【解决方案3】:

      正如 Gary 的学生所提到的,您需要删除 Cells 之前的点,以使代码按照您最初编写的方式工作。我不能确定,因为您只包含了一行代码,但是删除点时出现的错误可能与您定义变量的方式有关。

      我用定义为整数的变量运行了你的代码行,并且它起作用了:

      Sub TestClearLastColumn()
      
          Dim LastColData As Long
              Set LastColData = Range("A1").End(xlToRight).Column
      
          Dim LastRowData As Long
              Set LastRowData = Range("A1").End(xlDown).Row
      
          Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents
      
      End Sub
      

      我认为With 语句不适合您共享的代码行,但如果您要使用一个,With 将位于定义您正在操作的对象的行的开头.这是使用不必要的With 语句重写的代码:

      With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
          .ClearContents
      End With
      

      With 语句旨在使您免于重新键入代码并使您的编码更易于阅读。如果你对一个对象做不止一件事,它就会变得有用和合适。例如,如果您还想将列变为红色并添加粗黑边框,您可以使用如下With 语句:

      With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
          .ClearContents
          .Interior.Color = vbRed
          .BorderAround Color:=vbBlack, Weight:=xlThick
      End With
      

      否则,您必须为每个操作或属性声明范围,如下所示:

          Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents
          Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).Interior.Color = vbRed
          Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).BorderAround Color:=vbBlack, Weight:=xlThick
      

      我希望这能让您了解为什么 Gary 的学生认为编译器可能期望 With(即使它不合适)以及 With 如何以及何时在您的代码中有用。

      【讨论】:

      • 您需要将变量定义为 Long,否则您将遇到超过第 32767 行的问题
      【解决方案4】:

      问题不在于 with 语句,它在 Range 函数上,它不接受绝对单元格值.. 它应该像 Range("A4:B100").. 你可以参考以下线程供参考。。

      以下代码应该可以工作.. Convert cells(1,1) into "A1" and vice versa

      LastColData = Sheets(WSNAME).Range("A4").End(xlToRight).Column
                  LastRowData = Sheets(WSNAME).Range("A4").End(xlDown).Row
                  Rng = "A4:" & Sheets(WSNAME).Cells(LastRowData, LastColData).Address(RowAbsolute:=False, ColumnAbsolute:=False)
      
       Worksheets(WSNAME).Range(Rng).ClearContents
      

      【讨论】:

        【解决方案5】:

        我刚刚想出了一个非常简单的方法来清除整张纸。

        Sub ClearThisSheet()
        
        ActiveSheet.UsedRange.ClearContents
        
        End Sub
        

        【讨论】:

          【解决方案6】:

          为了清除所有包含数据的行,我使用了两个这样的变量。我喜欢这个,因为如果需要,您可以将其调整为特定范围的列。 将 Crow 变暗为整数 将 LastRow 调暗为整数

          CRow = 1
          LastRow = Cells(Rows.Count, 3).End(xlUp).Row
          
          Do Until CRow = LastRow + 1
              Cells(CRow, 1).Value = Empty
              Cells(CRow, 2).Value = Empty
              Cells(CRow, 3).Value = Empty
              Cells(CRow, 4).Value = Empty
              CRow = CRow + 1
          Loop
          

          【讨论】:

            【解决方案7】:

            我发现这是一种在所需行和列之间清理形状的简单方法。我不确定这是否是你要找的。希望对您有所帮助。

            Sub sbClearCellsOnlyData()
            Range("A1:C10").ClearContents
            End Sub
            

            【讨论】:

              【解决方案8】:

              对于像我这样遇到此问题并需要不清除标题的解决方案的任何人,这是适合我的一个衬里:

              ActiveSheet.Range("A3:A" & Range("A3").End(xlDown).Row).ClearContents
              

              从第三行开始 - 根据您的喜好更改。

              【讨论】:

              • 这似乎只到了页面的末尾,而不是一直到列
              • 对我来说,这只会持续到行中的第一个空单元格。相反,如果有一个快速的方法可以真正走到整行中的最后一个非空单元格,那就太好了。
              猜你喜欢
              • 1970-01-01
              • 2018-07-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多