Excel userform删除整行而不仅仅是预期的选择

时间:2014-12-05 18:47:40

标签: excel vba excel-vba userform cells

我有一个带有下拉框的用户表单,其中一个人可以选择要从列表中删除的记录。

以下代码正在删除整个行。我不要那个。我只想在电子表格中清除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

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

旁注:您无需选择单元格来操作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

以下是三种解决方案。两者都应该让你深入了解.Cells(row,col)思想在使用循环时是如何工作的。您正在使用变量来控制行号,并且可以将相同的概念应用于列。尽管它只有5列。另一个项目可能是50。所以你可以使用“For循环”循环它们。这是我的首选方法。

如果你想获得循环,请尝试这样的事情。使用变量作为列

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

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

答案 1 :(得分:1)

cells(lRw, 1).EntireRow.ClearContents是你的问题。 EntireRow函数选择cells(lRw, 1)指向的行。 .ClearContents函数清除所选内容。您应该用以下内容替换它:

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

您的变量lRw应该包含所选项目所在行的值,对吗?如果是,那么:

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

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

我认为PJ Rosenburg的解决方案有点不切实际,但我同意你应该回避使用.select功能。您可以在不使用它的情况下完成所需的一切。一旦理解了这个概念,你就会写出更好的代码。实际上,这里是对commandButton1_click的重写,它应该完全相同,但代码更少,更容易阅读。

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语句
  4. 无论如何,我希望这有助于更好地解释我之前想说的内容。