我有一个带有下拉框的用户表单,其中一个人可以选择要从列表中删除的记录。
以下代码正在删除整个行。我不要那个。我只想在电子表格中清除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
答案 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
请注意以下几点:
.select
无论如何,我希望这有助于更好地解释我之前想说的内容。