开发者社区 问答 正文

根据2个条件从表中删除行(1个条件工作),怎么做呢?

此代码在模块内部,当我选择一个单元格然后按下我的按钮“删除注释”时它被激活。我试图写这个是不断的错误所以我转向谷歌并尝试了别人的方法,使用过滤,但它不会工作,我不喜欢它如何激活包含表格的表格,所以我给了它另一个去写我自己的代码,让它几乎工作。

如果我更改此行:

If .DataBodyRange.Cells(Counter, .ListColumns("Name").Index) = EmployeeName And .DataBodyRange.Cells(Counter, .ListColumns("Date").Index) = SelectedDate Then .ListRows(Counter).Delete 对此,然后宏工作但显然删除了与该日期相关联的所有名称而不是工作表“日历”中单元格“B3”中的名称

If .DataBodyRange.Cells(Counter, .ListColumns("Date").Index) = SelectedDate Then .ListRows(Counter).Delete 如果我将其更改为此,我会收到类型不匹配错误

If .DataBodyRange.Cells(Counter, .ListColumns("Name").Index) = EmployeeName 完整代码如下

Dim Counter As Integer, EmployeeName As Integer, LastRow As Integer, SelectedDate As Date


If Intersect(ActiveCell, range("D12:AS23")) Is Nothing Then
    MsgBox "Please select a date.", , "Error"
    Exit Sub
Else
    If Sheets("Settings").range("Protected") = 2 Then
        With Sheets("Calendar")
            SelectedDate = Cells(ActiveCell.Row, 2) - 1 + ActiveCell.Value
            EmployeeName = range("B3")
        End With
        With Sheets("Notes").ListObjects("TblNotes")
            LastRow = .range.Rows.Count
            For Counter = LastRow To 1 Step -1
            If .DataBodyRange.Cells(Counter, .ListColumns("Name").Index) = EmployeeName And .DataBodyRange.Cells(Counter, .ListColumns("Date").Index) = SelectedDate Then
                .ListRows(Counter).Delete
            End If
            Next Counter
        End With
    Else
        'do nothing
    End If
End If

展开
收起
被纵养的懒猫 2019-09-17 16:47:02 658 分享 版权
阿里云 AI 助理回答

从你的描述来看,你正在使用VBA(Visual Basic for Applications)在Excel中编写宏来删除特定条件下的行。问题在于你想根据员工姓名(EmployeeName)和选定日期(SelectedDate)删除表格中的行,但遇到了一些挑战。

首先,注意到一个类型不匹配的错误,这通常是因为比较的数据类型不一致。在这个情况下,EmployeeName被定义为Integer,而你可能想用它来存储一个字符串(员工的名字),这应该是String类型而不是Integer。因此,请将EmployeeName的声明更改为:

Dim Counter As Integer, EmployeeName As String, LastRow As Integer, SelectedDate As Date

接下来,确保EmployeeName正确地获取了“B3”单元格的值,并且该值确实是一个字符串。修改这部分代码如下:

EmployeeName = Sheets("Calendar").Range("B3").Value

至于你的主要逻辑问题,你希望仅当员工姓名和日期都匹配时才删除行。你的原始逻辑是正确的,只是需要确保数据类型正确无误。所以,保持你的判断条件不变:

If .DataBodyRange.Cells(Counter, .ListColumns("Name").Index) = EmployeeName And .DataBodyRange.Cells(Counter, .ListColumns("Date").Index) = SelectedDate Then
    .ListRows(Counter).Delete
End If

如果以上更改后仍然遇到问题,可能需要检查以下几个点: 1. 确保SelectedDate计算正确,减去1是否符合你的业务逻辑。 2. 检查“TblNotes”表中的“Name”列和“Date”列的数据类型与你的变量类型是否匹配。 3. 确认没有任何其他隐藏的错误,比如表格范围是否正确,或者是否有保护设置阻止了行的删除。

最后,记得测试宏时要小心,特别是在执行删除操作时,以避免意外丢失数据。可以先在一个备份副本上进行测试。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: