2017-04-19 126 views
0

我嘗試使用下面通過值A欄命名爲「報告」工作表中運行,並創建一個名爲「Holidays_Requested」表這些範圍,但每次我把它與VBA宏命名範圍

彈出

對象所需的運行時錯誤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 
+0

你在哪裏試圖設置'命名範圍'?什麼線?你打算爲'Named Range'使用哪個變量? –

+0

我相信它是Application.ScreenUpdating = False data = Sheets(「Report」)。Range(「A2:E」&Report.Cells(Report.Rows.Count,「A」)。End(xlUp).Row) .Value2 Set dic = CreateObject(「scripting.dictionary」) – bloodmilksky

+1

具體哪行?你已經給了*三條*線,但錯誤只能在其中一條線上提出。我懷疑這是對'Report.Rows'的調用,除非'Report'對象是全局範圍的並且在另一個例程中實例化。請參閱下面的答案。 –

回答

2

在你的代碼中,你指的是一個非實例化的變量Report。由於此變量尚未聲明爲Dim語句,因此它將被視爲空變體,零長度字符串或0值數字或Nothing對象,具體取決於您如何/何時調用它。

因爲你在做Report.__something__編譯器假定它應該是Object(因爲只有Object類型有屬性/方法)。由於它不存在和/或尚未分配,你基本上做的:Nothing.Cells...

因爲爲了調用任何.__something__電話這將始終養424,您需要調用它反對有效,現有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,以獲得在給定範圍內查找「最後」單元格的更可靠方法。

here是一個VB.NET(類似的概念)解釋爲什麼你應該使用Option Explicit