Board logo

標題: vba 此處需要物件 (錯誤 424) [打印本頁]

作者: t591nm    時間: 2015-8-7 17:10     標題: vba 此處需要物件 (錯誤 424)

請問
我設定data陣列中的索引值為欲刪除的工作表名稱
並希望用for迴圈與if來判斷所指定的工作表是否存在
若存在則刪除
若不存在則跳出if到for 使其重新判斷
執行時在  If s1.Name = data Then   這一行發生錯誤
出現  此處需要物件 (錯誤 424)
該如何修改程式碼呢
程式碼如下所示
十分感謝

Public Sub 刪除多餘工作表()
    data = Array("資料1", "資料2", "資料3", "資料4", "資料5", "資料6", "資料7", "資料8", "連結0", "連結1", "連結2", _
    "連結3", "連結4", "連結5", "連結6", "連結7", "連結8", "連結9", "SERIES及PF比較可列印", "SERIES 比較貼上", _
         "記錄表轉換標籤", "來年紀錄可貼上")
    For s1 = 0 To 21
    If s1.Name = data Then
    Application.DisplayAlerts = False
    s1.Delete '刪除s1
    Application.DisplayAlerts = True
    End If
    Next
End Sub
作者: mark15jill    時間: 2015-8-7 18:25

請問
我設定data陣列中的索引值為欲刪除的工作表名稱
並希望用for迴圈與if來判斷所指定的工作表是否存在
...
t591nm 發表於 2015-8-7 17:10


以下範例供您參考、修改
  1.     Sub IsSheetExist()
  2.     Dim ws As Worksheet
  3.     Dim sName As String
  4.     sName = "一月"  '指定工作表
  5.     On Error Resume Next
  6.     Set ws = Sheets(sName)
  7.     If ws Is Nothing Then '指定的工作表不存在
  8.       Sheets.Add.Name = sName
  9.     Else '指定的工作表已存在
  10.       MsgBox "“" & sName & "”工作表已存在。"
  11.       ws.Activate
  12.     End If
  13.     End Sub
複製代碼

作者: koo    時間: 2015-8-7 21:51

本帖最後由 koo 於 2015-8-7 21:53 編輯

功力不夠只能寫到此雖然可以刪除但總覺得哪裡有問題
  1. Sub 巨集4()
  2. On Error Resume Next
  3. Data = Array("工作表2", "工作表3", "工作表4")
  4. For i = 1 To Sheets.Count
  5.     For J = LBound(Data) To UBound(Data)
  6.         If Sheets(i).Name = Data(J) Then
  7.             Application.DisplayAlerts = False
  8.             Sheets(i).Delete
  9.             Application.DisplayAlerts = True
  10.         End If
  11.     Next
  12. Next
  13. End Sub
複製代碼

作者: koo    時間: 2015-8-7 21:58

倒著跑
  1. Sub 巨集4()
  2. On Error Resume Next
  3. Data = Array("工作表2", "工作表3", "工作表4")
  4. For i = Sheets.Count To 1 Step -1
  5.     For J = LBound(Data) To UBound(Data)
  6.         If Sheets(i).Name = Data(J) Then
  7.             Application.DisplayAlerts = False
  8.             Sheets(i).Delete
  9.             Application.DisplayAlerts = True
  10.         End If
  11.     Next
  12. Next
  13. End Sub
複製代碼

作者: c_c_lai    時間: 2015-8-8 09:17

回復 1# t591nm
  1. For s1 = 0 To 21
  2.     If s1.Name = data Then
  3.         .
  4.         .
  5.     End If
  6. Next
複製代碼
s1 並非是物件,它在這裡扮演的是 0 到 21 的整數值變數,
所以在執行時,會產生 "此處需要物件 (錯誤 424)" 的訊息。
接下來更離譜的是  s1.Delete ' 刪除s1 ???

應用你寫的程式碼稍加修改,請自行測試:
  1. Sub 刪除多餘工作表()
  2.     Dim ts As Integer, aList$
  3.    
  4.     Data = Array("資料1", "資料2", "資料3", "資料4", "資料5", "資料6", "資料7", "資料8", "連結0", "連結1", "連結2", _
  5.           "連結3", "連結4", "連結5", "連結6", "連結7", "連結8", "連結9", "SERIES及PF比較可列印", "SERIES 比較貼上", _
  6.           "記錄表轉換標籤", "來年紀錄可貼上")
  7.     aList = Join(Data, ",")

  8.     Application.DisplayAlerts = False

  9.     For ts = Sheets.Count To 1 Step -1
  10.         If InStr(aList, Sheets(ts).Name) Then
  11.            Sheets(ts).Delete                 '  刪除欲刪除的工作表
  12.         End If
  13.     Next
  14.    
  15.     Application.DisplayAlerts = True
  16. End Sub
複製代碼

作者: t591nm    時間: 2015-8-10 08:43

回復 2# mark15jill

您好
這好像是針對刪除單一工作表
作者: t591nm    時間: 2015-8-10 08:55

回復 4# koo


For i = Sheets.Count To 1 Step -1  '請問此行是否將工作表最大值-1
    For J = LBound(data) To UBound(data) '此行是否將所設的陣列變數帶入 找出最大到最小
        If Sheets(i).Name = data(J) Then '再比對工作表與陣列變數
            Application.DisplayAlerts = False '若一樣則關閉警告視窗
            Sheets(i).Delete'並刪除
            Application.DisplayAlerts = True '再將警告視窗打開

請問我這樣理解對嗎
作者: t591nm    時間: 2015-8-10 09:03

回復 5# c_c_lai


不好意思
小妹新手上路
對於邏輯不是那麼能以理解

    aList$ '請問這是宣告要放字串的地方嗎
    aList = Join(Data, ",")'好像是透過自我定義的陣列變數中傳回多個字串
    For ts = Sheets.Count To 1 Step -1 '將工作表的最大值-1
        If InStr(aList, Sheets(ts).Name) Then '當陣列變數中的字串等於工作表的名稱時
           Sheets(ts).Delete                 '  刪除該工作表
        End If
    Next
    Application.DisplayAlerts = True'for迴圈跑完即把警告視窗打開


請問我這樣的解釋對嗎
作者: c_c_lai    時間: 2015-8-10 14:28

回復 8# t591nm
  1. Sub 刪除多餘工作表()
  2.     Dim ts As Integer, aList$  
  3.     ' aList$ 這是字串宣告, 等於宣告成  aList As String
  4.    
  5.     Data = Array("資料1", "資料2", "資料3", "資料4", "資料5", "資料6", "資料7", "資料8", "連結0", "連結1", "連結2", _
  6.           "連結3", "連結4", "連結5", "連結6", "連結7", "連結8", "連結9", "SERIES及PF比較可列印", "SERIES 比較貼上", _
  7.           "記錄表轉換標籤", "來年紀錄可貼上")
  8.     '  Example :  Data 陣列變數 Data(0) ~ Data(21) 的存放內容值。
  9.     '  Data :  :  Variant/Variant(0 to 21)
  10.     '  Data(0) :  "資料1" : Variant/String
  11.     '  Data(1) :  "資料2" : Variant/String
  12.     '  Data(2) :  "資料3" : Variant/String
  13.     '  .
  14.     '  .
  15.     '  .
  16.     '  Data(20) : "記錄表轉換標籤" : Variant/String
  17.     '  Data(21) : "來年紀錄可貼上" : Variant/String
  18.    
  19.     aList = Join(Data, ",") '  集合陣列 Data 內容,並以 "," 作為分隔符號。結果如下:
  20.     '  aList = "資料1,資料2,資料3,資料4,資料5,資料6,資料7,資料8,連結0,連結1,連結2,連結3,連結4,連結5,連結6,連結7,連結8,連結9,SERIES及PF比較可列印,SERIES 比較貼上,記錄表轉換標籤,來年紀錄可貼上" : String
  21.    
  22.     Application.DisplayAlerts = False
  23.      
  24.     For ts = Sheets.Count To 1 Step -1
  25.         '  如果 aList 字串中有符合該表單名稱者,則予以刪除。
  26.         '  譬如:該表單名稱為 "記錄表轉換標籤",則比對結果發現該 aList 字串中有此字串名稱。
  27.         '        則直接逕行刪除;否則比對不成功則不處理。
  28.         If InStr(aList, Sheets(ts).Name) Then
  29.            Sheets(ts).Delete                 '  刪除欲刪除的工作表
  30.         End If
  31.     Next
  32.    
  33.     Application.DisplayAlerts = True
  34. End Sub
複製代碼

作者: t591nm    時間: 2015-8-10 16:33

回復 9# c_c_lai

清楚且明瞭

十分感恩c大




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)