Board logo

標題: [發問] 沒有設定物件變數或 With 區塊變數 [打印本頁]

作者: esperanto    時間: 2014-6-9 10:19     標題: 沒有設定物件變數或 With 區塊變數

各位好

我的程式有階段錯誤''91''的問題,但我實在找不出來原因,
只好上來求教了。
程式碼如下:

Sub Scheduling()
With Worksheets("Scheduling")
    n = .Columns("A").Find("*", SearchOrder:=xlByRows, LookIn:=xlFormulas, SearchDirection:=xlPrevious).EntireRow.Row
    For i = 5 To n Step 2
        ProductID = Worksheets("Scheduling").Cells(i, 3)
            Set d = Sheets("KEYIN").Columns("AH").Find(ProductID, LookIn:=xlValues, lookat:=xlWhole)  '在資料庫中搜尋相等 料號 之值
            If Not d Is Nothing Then  ' 如果找到相等之值的話
                Product = Worksheets("KEYIN").Cells(d.Row, d.Column + 1)
            End If
        .Cells(i, 4) = Product
    Next i
End With

Worksheets("M").Activate
    For i = 3 To 23
        For Each od In ActiveSheet.Buttons
           If od.Name = ("Buttons " & i) Then
                od.Delete
           End If
        Next        
        For Each od In ActiveSheet.OLEObjects
           If od.Name = ("CheckBox" & CStr(i)) Or od.Name = ("CheckBoxb" & CStr(i)) Then
                od.Delete
           End If
        Next
        serial = 0
        
        machine = Worksheets("M").Cells(i, 3)
        Set c = Worksheets("Scheduling").Columns("B").Find(machine, LookIn:=xlValues, lookat:=xlWhole) '在資料庫中搜尋相等  之值
        If Not c Is Nothing Then  ' 如果找到相等之值的話
            firstAddress = c.Address
            serial = 1
            Do
                If Worksheets("Scheduling").Cells(c.Row, 1) = Date And serial = 1 Then                    
                    ProductID = Worksheets("Scheduling").Cells(c.Row, 3)
                    Product = Worksheets("Scheduling").Cells(c.Row, 4)
                    Demand = Worksheets("Scheduling").Cells(c.Row, 5)
                    Operater = Worksheets("Scheduling").Cells(c.Row, 7)
                    Starttime = Worksheets("Scheduling").Cells(c.Row, 9)
                    Worksheets("Scheduling").Cells(c.Row, 11) = 1
                    Range(Worksheets("Scheduling").Cells(c.Row, 1), Worksheets("Scheduling").Cells(c.Row + 1, 9)).ClearContents
                    Worksheets("M").Cells(i, 4) = Product
                    Worksheets("M").Cells(i, 5) = Demand
                    Worksheets("M").Cells(i, 7) = Operater
                    Worksheets("M").Cells(i, 12) = Starttime
                    
                    If Operater > 0 Then
                        SS = Worksheets("M").Cells(i, 1).Top '所選擇的目標位址
                        ll = Worksheets("M").Cells(i, 1).Left
                        Set ob = Worksheets("M").Buttons.Add(ll + 940, SS + 6, 33, 19) '加入按鈕
                        ob.Characters.Text = "完成"  '指定按鈕文字
                        ob.OnAction = "scheduleok"     '指定按鈕巨集
                        ob.Name = "Buttons " & i   '指定按鈕名稱

                        S = Worksheets("M").Cells(i, 7).Top '所選擇的目標位址
                        l = Worksheets("M").Cells(i, 7).Left
                        Set ob1 = Worksheets("M").OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
                            DisplayAsIcon:=False, Left:=l, Top:=S + 1, Width:=26, Height:=13)
                            ob1.Name = "CheckBox" & i
                            ob1.Object.Caption = "日"
                            ob1.Object.Font.Size = 9
                            ob1.Object.ForeColor = RGB(255, 128, 128)
                            'ob1.Object.AutoSize = True
                            ob1.Object.BackColor = Worksheets("M").Cells(i, 7).Interior.Color
                            'ob1.Object.SpecialEffect = 0

                    End If
                    
                ElseIf Worksheets("Scheduling").Cells(c.Row, 1) = Date And serial = 2 Then
                    ProductID = Worksheets("Scheduling").Cells(c.Row, 3)
                    Product = Worksheets("Scheduling").Cells(c.Row, 4)
                    Worksheets("M").Cells(i, 13) = Product
                End If
                serial = 2
            Set c = Worksheets("Scheduling").Columns("B").FindNext(c)
            Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
         
    Next i
End Sub

還請各位高手們相助!
作者: owen06    時間: 2014-6-9 11:12

回復 1# esperanto


   方便附個檔案嗎?這樣大家比較好幫你查看一下問題點。
作者: esperanto    時間: 2014-6-9 11:40

owen06 大:

抱歉,因檔案有公司的資料,不方便附檔。  Orz

我發現如果把

Loop While Not c Is Nothing And c.Address <> firstAddress

改成

Loop While Not c Is Nothing

似乎就沒問題了?!
這樣看來好像是因為當 FindNext(c) 找不到時,c沒有值所以發生問題。
可是我在別的程式中也是這樣使用 FindNext 配合Do....Loop,都沒發生問題啊?
我是照VBA裡的說明範例寫的,
為何在這段程式中會有"沒有設定物件變數或 With 區塊變數"的錯誤呢?

希望能有人指教小弟,我為了這問題卡了1天...........Orz
作者: stillfish00    時間: 2014-6-9 13:33

本帖最後由 stillfish00 於 2014-6-9 13:39 編輯

回復 3# esperanto
說明範例的bug吧,我會把
  1. Loop While Not c Is Nothing And c.Address <> firstAddress
複製代碼
改成
  1.     If c Is Nothing Then Exit Do
  2. Loop While c.Address <> FirstAddress
複製代碼
原因應該是loop while 條件中,
VBA會把兩條件先求出來再And起來,造成
c.Address <> FirstAddress左式在c為nothing時求不出來。
作者: esperanto    時間: 2014-6-9 13:59

回復 4# stillfish00


    謝謝stillfish00大大

         這樣寫確實能解決問題,但
               Loop While Not c Is Nothing And c.Address <> firstAddress
         這行程式我之前都是這樣寫的,都可正常運作,為何在這段程式中就會出問題呢?
作者: stillfish00    時間: 2014-6-9 15:28

回復 5# esperanto
應該是你在別的程式,在找到c後不會改掉c的值,所以loop中不會有c為nothing(找不到下一個)的問題。
而VBA說明範例
  1. With Worksheets(1).Range("a1:a500")
  2.     Set c = .Find(2, LookIn:=xlValues)
  3.     If Not c Is Nothing Then
  4.         FirstAddress = c.Address
  5.         Do
  6.             c.Value = 5
  7.             Set c = .FindNext(c)
  8.         Loop While Not c Is Nothing And c.Address <> FirstAddress
  9.     End If
  10.   End With
複製代碼
說明範例有c.value = 5 ,2都改為5後就找不到2了
而你的例子,有Range(Worksheets("Scheduling").Cells(c.Row, 1), Worksheets("Scheduling").Cells(c.Row + 1, 9)).ClearContents
會把你找的machine清掉,所以FindNext最後會傳回Nothing
作者: esperanto    時間: 2014-6-9 15:49

回復 6# stillfish00


    謝謝stillfish00大大

                 看來應該是這樣了,我沒注意到說明範例有先給c一個值。
                 大大真是明察秋毫 XD




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