用于命名范围的VBA宏

时间:2017-04-19 14:40:17

标签: vba excel-vba excel

我正在尝试使用以下内容在名为“Report”的工作表中的A列中运行值,并在名为“Holidays_Requested”的工作表中创建这些范围,但每次我弹出

  

Object Required Runtime error 424.

任何人都可以帮助或了解使用VBA创建命名范围的替代方法。

Sub TransposeRange_new_code()
    Dim OutRange As Range
    Dim x As Long, y As Long
    Dim sKey As String
    Dim maxCount As Long
    Dim data, dic, keys, items, dataout()


    Application.ScreenUpdating = False
    data = Sheets("Report").Range("A2:E" & Report.Cells(Report.Rows.Count, "A").End(xlUp).Row).Value2


    Set dic = CreateObject("scripting.dictionary")
    Set OutRange = Sheets("Holidays_Requested").Range("B2")


    For x = 1 To UBound(data, 1)
        If Trim$(data(x, 1)) <> "_" Then
        sKey = Trim$(data(x, 1)) & Chr(0) & Trim$(data(x, 2))
        If Not dic.exists(sKey) Then dic.Add sKey, CreateObject("Scripting.Dictionary")
        dic(sKey).Add x, Array(data(x, 4), data(x, 5))
        If dic(sKey).Count > maxCount Then maxCount = dic(sKey).Count
        End If
    Next


    ReDim dataout(1 To maxCount + 1, 1 To dic.Count * 3)
    keys = dic.keys
    items = dic.items
    For x = LBound(keys) To UBound(keys)
        dataout(1, x * 3 + 1) = Split(keys(x), Chr(0))(0)
        dataout(1, x * 3 + 2) = Split(keys(x), Chr(0))(1)
        For y = 1 To items(x).Count
            dataout(1 + y, x * 3 + 1) = items(x).items()(y - 1)(0)
            dataout(1 + y, x * 3 + 2) = items(x).items()(y - 1)(1)
        Next y
    Next




    OutRange.Resize(UBound(dataout, 1), UBound(dataout, 2)).Value2 = dataout


    For x = 1 To UBound(keys)
        OutRange.Offset(0, (x - 1) * 3).Resize(maxCount, 2).Name = "" & validName(Split(keys(x - 1), Chr(0))(0))
        With OutRange.Offset(0, (x - 1) * 3 + 1)
            .Hyperlinks.Add anchor:=.Cells(1), Address:="mailto://" & .Value2, TextToDisplay:=.Value2
        End With
    Next


End Sub

1 个答案:

答案 0 :(得分:2)

在您的代码中,您指的是未实例化的变量Report。由于此变量未使用Dim语句声明,因此它将被视为空变量,零长度字符串或0值数字或Nothing对象,具体取决于如何/何时召唤它。

由于您正在执行Report.__something__,编译器会认为它应该是Object(因为只有Object类型具有属性/方法)。由于它不存在和/或尚未分配,因此您实质上在做:Nothing.Cells...

这将始终引发424,因为要调用任何 .__something__调用,您需要针对有效的现有Object调用它。

变化:

data = Sheets("Report").Range("A2:E" & Report.Cells(Report.Rows.Count, "A").End(xlUp).Row).Value2

要:

With Sheets("Report")
    data = .Range("A2:E" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value2
End With

与往常一样,在每个模块中使用Option Explicit将阻止您使用未声明的变量执行/运行代码。我建议在每个代码模块的顶部添加该语句,然后纠正可能出现的任何编译错误(例如Variable undefined)。

另外:请参阅here了解更多可靠的方法来查找&#34;最后&#34;在给定范围内的细胞。

here是一个VB.NET(概念上类似)解释为什么你应该使用Option Explicit