excel 如何避免在执行宏时出现#NA错误

jjhzyzn0  于 2023-01-14  发布在  其他
关注(0)|答案(2)|浏览(137)

我的宏有这个错误。我的宏从一个表和另一个工作表中获取数据,在一个表中输出第三个工作表的每个值的数据。
假设我的表的值为:杰克和丹尼尔。在我的第三张纸上,我有足球和橄榄球。在第二页的输出将是:

Jack Football
Jack Rugby
Daniel Football
Daniel Rugby

下面是我的宏:

Sub yo()
Dim Letters, Chk, Ele As Range, i As Long: Letters = Sheets("Sports").Range("C3:C5").Value
For Each Ele In Sheets("Students").ListObjects(1).ListColumns(1).DataBodyRange
    With Sheets("OK").ListObjects(1)
        Chk = Application.Match(Ele, .ListColumns(1).Range, 0)
        If IsError(Chk) Then
            For i = 1 To 3
                .ListRows.Add.Range = Array(Ele, Letters(i, 1))
            Next i
        End If
    End With
Next Ele
End Sub

然而,这工作得很好。问题来自我的第二张工作表中表的所有其他列。它们都得到值“#NA”。所以不是什么都没有或公式向下展开,而是出现了那个错误。
我怎样才能克服这个错误?

kmynzznz

kmynzznz1#

复制到Excel表格(ListObject

  • 简单的回答是,在这个例子中,ListRow有四列,而您只给它分配了一个两列的数组,从答案看,您自己已经得出了结论(.Resize(, 2))。
    进步
Option Explicit

Sub AddStudents()
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim wsSports As Worksheet: Set wsSports = wb.Sheets("Sports")
    Dim Sports(): Sports = wsSports.Range("C3:C5").Value
    Dim SportsCount As Long: SportsCount = UBound(Sports, 1)
    
    Dim wsStudents As Worksheet: Set wsStudents = wb.Sheets("Students")
    Dim loStudents As ListObject: Set loStudents = wsStudents.ListObjects(1)
    Dim lcStudents As ListColumn: Set lcStudents = loStudents.ListColumns(1)
    Dim rgStudents As Range: Set rgStudents = lcStudents.DataBodyRange
    
    Dim wsOK As Worksheet: Set wsOK = wb.Sheets("OK")
    Dim loOK As ListObject: Set loOK = wsOK.ListObjects(1)
    Dim lcOK As ListColumn: Set lcOK = loOK.ListColumns(1)
    Dim rgOK As Range: Set rgOK = lcOK.DataBodyRange
    
    Dim cell As Range, Student, MatchOK, r As Long, IsNotStudentAdded As Boolean
    
    For Each cell In rgStudents.Cells
        If rgOK Is Nothing Then
            IsNotStudentAdded = True
        Else
            MatchOK = Application.Match(cell.Value, rgOK, 0)
            If IsError(MatchOK) Then IsNotStudentAdded = True
        End If
        If IsNotStudentAdded Then
            Student = cell.Value
            For r = 1 To SportsCount
                loOK.ListRows.Add.Range.Resize(, 2).Value _
                     = Array(Student, Sports(r, 1))
            Next r
            IsNotStudentAdded = False
            Set rgOK = lcOK.DataBodyRange
        End If
    Next cell

    MsgBox "Students added.", vbInformation

End Sub
r1zhe5dt

r1zhe5dt2#

所以我决定彻底修改我的宏以避免任何错误:

Sub Macro7()
Dim N, S, i, j
Application.ScreenUpdating = False
N = Range("Tableau1"): S = Sheets("Sports").Range("C3:C5").Value
With Range("Tableau2").ListObject
  If .ListRows.Count > 0 Then .DataBodyRange.Delete
  For Each i In N
    For Each j In S
      .ListRows.Add.Range.Resize(, 2) = Array(i, j)
    Next
  Next
End With
End Sub

相关问题