- - 編輯 - -
進一步挖掘后,我發現根本原因是一個函式,如果所需名稱已被現有作業表占用,則該函式會在新作業表名稱末尾增加一個數字 - 請向下滾動到“編輯”以向右切到追趕!
-----*-----
我正在嘗試將一系列單元格從一個作業表(“RIG”)復制到另一個新創建的作業表中。已分配新作業表的名稱,并且字串NewestSheet將此名稱作為其值。
單元格范圍已在字串中定義DataCopyRange。
所有變數都被定義為在任何 subs 之外的公共變數,我已經驗證它們在整個程序中都通過了。
我正在嘗試將DataCopyRange已根據整數定義為特定范圍的復制rangetop到最新的作業表NewestSheet,但這會導致運行時錯誤 9 “下標超出范圍”在下面突出顯示的行中當我嘗試修復時對此,我用NewestSheet完美復制單元格的原始作業表“RIG”替換。
我已經包含了代碼部分,但是在擺弄了字串和范圍之后,我發現問題僅來自最后一行:
Sheets("Sampling Report").Visible = True
Sheets("Sampling Report").Copy After:=Worksheets(Worksheets.Count)
ActiveWindow.ActiveSheet.Name = NewDataName
NewestSheet = NewDataName
If rangetop = 0 Then
errnorangetop = MsgBox("An error occured. Range max = " & rangetop, vbCritical, "Error")
Exit Sub
End If
'Select area of data to copy
DataCopyRange = "C17:G" & rangetop
'Copy data from RIG tab - this is the line with the error!
Worksheets("RIG").Range(DataCopyRange).Copy Worksheets(NewestSheet).Range("A10")
(注意NewDataName來自為新作業表分配名稱的函式,在這里我分配了一個與函式回傳的值相同的字串,只是為了讓事情分開)
在將資料復制到新作業表時,我已經咨詢了很多關于錯誤 9 下標超出范圍的其他答案,并嘗試了一些建議的答案,但尚未設法修復它。
該錯誤幾乎肯定來自NewestSheet,但是我已經通過除錯迭代了所有現有的作業表名稱,并且在除錯中出現了正確的名稱。它應該與此字串中的值完全相同。
我已經確定最后一行中的兩個字串都顯示了它們應該顯示的內容,在這種情況下:
DataCopyRange是“C17:G23”(字串)
NewestSheet提取NewDataName函式給它的值,“Sampling Report 27-10-2022 1”(字串)
我只在一個作業簿上作業,沒有打開其他作業簿。
- - - - - - - 編輯 - - - - - - -
進一步挖掘發現問題可能來自函式,它似乎是在選項卡名稱中添加 1(想法是它檢查名稱是否已經存在,并將最終數字增加到 2、3 等)。
不知道為什么/如何這樣做,因為當我運行除錯時,似乎仍然只有一張以“1”結尾的作業表。我想保留在i = i 1某個地方,以便如果標簽已經存在名稱和 1,它將增加 1 到 2。
不確定如何修復它,以便在將名稱發送到上面的 Sub 之前不會將 1 增加到 2:
Private Function NewDataName() As String
Dim ws As Worksheet
Dim i As Long: i = 1
Dim shtname As String
Dim shortdate As String
shortdate = Format(Date, "dd-mm-yyyy")
Do
' Create a worksheet name
shtname = "Sampling Report " & shortdate & " " & i
' Check if we already have a worksheet with that name
On Error Resume Next
Set ws = ThisWorkbook.Sheets(shtname)
On Error GoTo 0
'If no worksheet with that name then return name
If ws Is Nothing Then
NewDataName = shtname
Exit Do
Else
i = i 1
Set ws = Nothing
End If
Loop
End Function
有任何想法嗎?
uj5u.com熱心網友回復:
試著把它分解一下,這樣更容易看出問題出在哪里:
EDIT2:這對我有用(假設沒有如下所述的隱藏表)
Sub Tester()
Dim rangetop As Long, newName As String
Dim wb As Workbook, wsSR As Worksheet, wsNew As Worksheet, wsRig As Worksheet
Set wb = ThisWorkbook 'specify a workbook
Set wsRig = wb.Worksheets("RIG")
Set wsSR = wb.Worksheets("Sampling Report")
wsSR.Visible = True
wsSR.Copy After:=wb.Worksheets(wb.Worksheets.Count)
Set wsNew = wb.Worksheets(wb.Worksheets.Count) 'get a reference to the copy
wsNew.Name = NewDataName(wb) 'call the function
rangetop = 25
If rangetop = 0 Then
MsgBox "An error occured. Range max = " & rangetop, vbCritical, "Error"
Exit Sub
End If
Worksheets("RIG").Range("C17:G" & rangetop).Copy wsNew.Range("A10")
End Sub
Function NewDataName(wb As Workbook) As String
Dim i As Long, root As String
root = "Sampling Report " & Format(Date, "dd-mm-yyyy") & " "
i = 1
Do While SheetExists(wb, root & i)
i = i 1
Loop
NewDataName = root & i
End Function
Function SheetExists(wb As Workbook, nm As String) As Boolean
On Error Resume Next
SheetExists = wb.Worksheets(nm).Name = nm
End Function
編輯:您不能呼叫該Worksheet.Copy方法并將隱藏的作業表作為引數的After引數傳遞:如果這樣做,則副本將不會以預期的索引結束。
例如。如果最后一個作業表“xxx”wb被隱藏,那么:
ListSheets wb
wsSR.Copy After:=wb.Worksheets(wb.Worksheets.Count)
ListSheets wb
給出輸出:
----------------------------
1 RIG visible
2 Sampling Report visible
3 xxx hidden
----------------------------
1 RIG visible
2 Sampling Report visible
3 Sampling Report (2) visible
4 xxx hidden
注意副本在哪里結束。如果您有隱藏的作業表,請將它們移動到作業簿的“前面”以避免此問題。
清單表:
Sub ListSheets(wb As Workbook)
Dim i As Long
Debug.Print "----------------------------"
For i = 1 To wb.Worksheets.Count
With wb.Worksheets(i)
Debug.Print i, .Name, , IIf(.Visible, "visible", "hidden")
End With
Next i
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521977.html
標籤:擅长vba
上一篇:無法在customTableViewCell中設定imageView的影像
下一篇:使用VBA添加到不規則單元格選擇
