【问题标题】:How can I add or delete lines in multiple Excel sheets with VBA如何使用 VBA 在多个 Excel 工作表中添加或删除行
【发布时间】:2021-03-16 11:12:32
【问题描述】:

我有一个 Excel 文件,我必须在其中一个工作表中输入名称,然后其他工作表添加或删除行。

例如,我有 Excel 表格 UserNumberSheetGradeSheet

我在 User-Sheet 中输入“John Doe”、“Jane Doe”和“Phil Doe”,在 NumberSheet 和 GradeSheet 中添加了 3 行。

我现在有这个代码:

Private Sub Worksheet_Change(ByVal Target As range)
Dim KeyCells As range

' The variable KeyCells contains the cells that will
' cause an alert when they are changed.
' Start Cell is A2 because Names start there
Set KeyCells = range("A2:A100")

If Not Application.Intersect(KeyCells, range(Target.Address)) _
       Is Nothing Then

' Display a message when one of the designated cells has been
    ' changed.
    ' Place your code here.
    
    'The row in the user-Sheet, where I added or removed a user
    targetRow = Target.row - 1
    'In the Number Sheet, the row from where the names should get listed
    targetRowInNumberSheet = targetRow
    
    'The value from the cell where I entered the name
    vlue = Target.Value
    
    If IsEmpty(vlue) Then
      'Delete row in Worksheets
      Worksheets("NumberSheet").Rows(targetRowInNumberSheet).Delete
      Worksheets("GradeSheet").Rows(targetRowInNumberSheet ).Delete
    Else
      'Add row in Worksheets
      Worksheets("NumberSheet").Rows(targetRowInNumberSheet).Insert
      Worksheets("GradeSheet").Rows(targetRowInNumberSheet ).Insert
    End If
End If
End Sub

现在,如果我添加一个名称、删除一个名称或在其间某处插入一行,则此代码有效。 但是我不能删除多个名字,或者删除一行。在这两种情况下IsEmpty(vlue) 都是错误的,我不知道为什么

【问题讨论】:

  • 在您的代码中,您是否尝试“删除多个名称”?
  • 您的Target 范围能否包含更多单元格?

标签: excel vba


【解决方案1】:

IsEmpty 不检查单元格值是否为空...

它检查变量是否已被初始化。

代替If IsEmpty(vlue) Then,简单请使用:

If vlue = "" Then

或:

if vlue = Empty Then 'this is different!

请检查here微软如何描述此功能...

然后,建议声明所有使用的变量(targetRowtargetRowInNumberSheetvlue)。 如果你的Target 必须只包含一个单元格,你应该添加一个代码行:

If Target.count>1 then Exit Sub

如果您想允许多个单元格范围,您应该声明它并以不同的方式处理您尝试执行的操作。我问过这个,但你什么也没回答。如果是这样,我可以告诉你如何进行。

【讨论】:

    【解决方案2】:

    那是因为 Worksheet_Change 函数的 Input 参数是一个名为 Target 的 Range。

    范围是一个区域,而不是单个值。 如果您现在删除多个行,则 Target.Row 属性仅返回目标范围中的第一行,因此只会删除第一个条目。

    因此,您应该进一步寻找有关 Ranges 的信息。

    我会试试这个: 计算目标范围内的所有行数:

    Target.Rows.Count
    

    有了这个数字,您可以从范围的第一个行索引开始,就像在您的示例中使用循环或其他东西一样:

     targetRow = Target.row - 1
    

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多