Excel用户表单不仅仅是打算select删除整行

我有一个用户表单有一个下拉框,其中一个人可以select一个logging从列表中删除。

下面的代码是删除整个行。 我不要那个。 我只想在我的电子表格中清除A:E之间的单元格。

我不知道如何描述这个,所以我提前道歉。 这里是代码:

Private Sub CheckBox1_Click() End Sub Private Sub CommandButton1_Click() Dim lRw As Long ActiveWorkbook.Sheets("RAWDATA").Visible = xlSheetVisible 'get the row number. add 2 because ListIndex starts at one lRw = Me.ComboBox1.ListIndex + 2 ActiveWorkbook.Sheets("RAWDATA").Select Cells(lRw, 1).EntireRow.ClearContents ActiveWorkbook.Sheets("RAWDATA").Visible = xlSheetHidden End Sub Private Sub CommandButton2_Click() ComboBox1.Value = "" ComboBox1.Clear ComboBox1.Clear Unload Me End Sub Private Sub UserForm_Initialize() 'assumes data starts in A1 and has a header row Me.ComboBox1.List = ActiveWorkbook.Sheets("RAWDATA").Cells(1, 2).CurrentRegion.Offset(1, 2).Value End Sub 

在这里输入图像说明

在这里输入图像说明

cells(lRw, 1).EntireRow.ClearContents是你的问题。 EntireRow函数selectcells(lRw, 1)指向的行。 .ClearContents函数清除所选内容。 你应该用下面的东西replace它:

Range("A" & <the row number> & ":J" & <the row number>).clearcontents

你的variableslRw应该保存所选项目所在行的值,对吗? 如果是,那么:

Range("A" & lRw & ":J" & lRw ).clearcontents

应该pipe用。 您可以将列字母更改为任何您想要清除的内容。

我认为PJ Rosenburg的解决scheme有点不切实际,但我同意你应该避免使用.select函数。 你可以做所有你需要做的而不使用它。 一旦你理解了这个概念,你就会写出更好的代码。 事实上,这里是你的commandButton1_click的重写,它应该做同样的事情,但代码less,易于阅读。

 Private Sub CommandButton1_Click() Dim lRw As Long lRw = Me.ComboBox1.ListIndex + 2 with ActiveWorkbook.Sheets("RAWDATA") .Visible = xlSheetVisible .Range("A" & lRw & ":J" & lRw ).clearcontents .Visible = xlSheetHidden end with end sub 

注意几件事情:

  1. 不,请.select
  2. 移动赋值语句
  3. With / End With语句的添加

无论如何,我希望这有助于更好地解释我之前想说的话。

注意:你不需要select单元格来操作vba中的内容。 查看这个链接来更详细地解释这个概念: how-to-avoid-using-select-in-excel-vba-macros

这是问题代码。 您正在清除整行,使用“.EntireRow.ClearContents”

 ActiveWorkbook.Sheets("RAWDATA").Select Cells(lRw, 1).EntireRow.ClearContents ActiveWorkbook.Sheets("RAWDATA").Visible = xlSheetHidden 

这里有三个解决scheme 。 两者都应该让你了解.Cells(行,列)思想如何在使用循环时起作用。 您正在使用variables来控制行号,并且可以将相同的概念应用于列。 即使只有5列。 另一个项目可能是50。 所以你可以循环使用“For循环”这是我首选的方法。

如果你想变得糟糕 ,试试这样的事情吧。 为列使用一个variables

 For lCol = 1 To 5 Sheets("RAWDATA").Cells(lRw, lCol).ClearContents Next lCol 

您可以一次执行一个单元格直接对列编号进行编码:

 Sheets("RAWDATA").Cells(lRw, 1).ClearContents Sheets("RAWDATA").Cells(lRw, 2).ClearContents Sheets("RAWDATA").Cells(lRw, 3).ClearContents Sheets("RAWDATA").Cells(lRw, 4).ClearContents Sheets("RAWDATA").Cells(lRw, 5).ClearContents 

您可以一次执行一个单元格直接对列进行编码LETTER

 Sheets("RAWDATA").Cells(lRw, "A").ClearContents Sheets("RAWDATA").Cells(lRw, "B").ClearContents Sheets("RAWDATA").Cells(lRw, "C").ClearContents Sheets("RAWDATA").Cells(lRw, "D").ClearContents Sheets("RAWDATA").Cells(lRw, "E").ClearContents 

编辑:添加了一些解释和链接