2013-02-21 190 views
3

我在下面的代碼中收到一個錯誤,標記爲Object Required。請幫助我。 Temp文件意味着一個模板,詳細信息是從Combo代碼派生出來的,這些代碼是需要在模板中填充的數據,並根據下面的代碼發送電子郵件。Visual basic編譯器錯誤

Sub Emails() 
    Dim R_No As Integer 

    Templ.Select 
    Templ.Range("C11") = "" 
    Templ.Range("D11") = "" 
    Templ.Range("E11") = "" 
    Temp1.Range("F11") = "" <-------- Error 
    Temp1.Range("G11") = "" 
    Templ.Range("C14") = "" 
    Templ.Range("D14") = "" 
    Templ.Range("E14") = "" 
    Temp1.Range("F14") = "" 
    Temp1.Range("G14") = "" 
    Rows("10:11").Select 
    Selection.EntireRow.Hidden = True 
    Rows("13:14").Select 
    Selection.EntireRow.Hidden = True 

    R_No = 2 
    Do Until Combo.Cells(R_No, 1) = "" 
     If Combo.Cells(R_No, 1) = "Order" Then 
      Combo.Cells(R_No, 13) = Combo.Cells(R_No, 2) 
     Else 
      Combo.Cells(R_No, 13) = Combo.Cells(R_No, 2) & " & " & Combo.Cells(R_No, 4) 
     End If 

     If Combo.Cells(R_No, 7) = Combo.Cells(R_No + 1, 7) Then 
      If Combo.Cells(R_No, 1) = Combo.Cells(R_No + 1, 1) Then 
       If Combo.Cells(R_No, 1) = "Order" Then 
        Rows("10:11").Select 
        Selection.EntireRow.Hidden = False 
        If Templ.Range("C11") = "" Then 
         Templ.Range("C11") = Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Combo.Cells(R_No, 5) 
         Temp1.Range("F11") = Combo.Cells(R_No, 6) 
         Temp1.Range("G11") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
        End If 
       End If 
       If Combo.Cells(R_No, 1) = "Receipt" Then 
        Rows("13:14").Select 
        Selection.EntireRow.Hidden = False 
        If Templ.Range("C14") = "" Then 
         Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Combo.Cells(R_No, 5) 
         Temp1.Range("F14") = Combo.Cells(R_No, 6) 
         Temp1.Range("G14") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
        End If 
       End If 
      Else 
       If Combo.Cells(R_No, 1) = "Order" Then 
        Rows("10:11").Select 
        Selection.EntireRow.Hidden = False 
        If Templ.Range("C11") = "" Then 
         Templ.Range("C11") = Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Combo.Cells(R_No, 5) 
         Temp1.Range("F11") = Combo.Cells(R_No, 6) 
         Temp1.Range("G11") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
        End If 
       End If 
       If Combo.Cells(R_No, 1) = "Receipt" Then 
        Rows("13:14").Select 
        Selection.EntireRow.Hidden = False 
        If Templ.Range("C14") = "" Then 
         Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Combo.Cells(R_No, 5) 
         Temp1.Range("F14") = Combo.Cells(R_No, 6) 
         Temp1.Range("G14") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
        End If 
       End If 
      End If 
     Else 
      If Combo.Cells(R_No, 1) = "Order" Then 
       Rows("10:11").Select 
       Selection.EntireRow.Hidden = False 
       If Templ.Range("C11") = "" Then 
         Templ.Range("C11") = Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Combo.Cells(R_No, 5) 
         Temp1.Range("F11") = Combo.Cells(R_No, 6) 
         Temp1.Range("G11") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C11") = Templ.Range("C11") & Templ.Range("I2") & Combo.Cells(R_No, 2) 
         Templ.Range("D11") = Templ.Range("D11") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E11") = Templ.Range("E11") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F11") = Templ.Range("F11") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G11") = Templ.Range("G11") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
       End If 
      End If 
      If Combo.Cells(R_No, 1) = "Receipt" Then 
       Rows("13:14").Select 
       Selection.EntireRow.Hidden = False 
       If Templ.Range("C14") = "" Then 
         Templ.Range("C14") = Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Combo.Cells(R_No, 5) 
         Temp1.Range("F14") = Combo.Cells(R_No, 6) 
         Temp1.Range("G14") = Combo.Cells(R_No, 9) 
        Else 
         Templ.Range("C14") = Templ.Range("C14") & Templ.Range("I2") & Combo.Cells(R_No, 2) & "-" & Combo.Cells(R_No, 4) 
         Templ.Range("D14") = Templ.Range("D14") & Templ.Range("I2") & Combo.Cells(R_No, 3) 
         Templ.Range("E14") = Templ.Range("E14") & Templ.Range("I2") & Combo.Cells(R_No, 5) 
         Templ.Range("F14") = Templ.Range("F14") & Templ.Range("I2") & Combo.Cells(R_No, 6) 
         Templ.Range("G14") = Templ.Range("G14") & Templ.Range("I2") & Combo.Cells(R_No, 9) 
       End If 
      End If 
      Templ.Range("C6") = "Dear " & Left(Combo.Cells(R_No, 7), InStr(1, Combo.Cells(R_No, 7), " ") - 1) & "," 
      Templ.Range("A1:H48").Select 
      ThisWorkbook.EnvelopeVisible = False 
      ThisWorkbook.EnvelopeVisible = True 

      With ThisWorkbook.Sheets("Templete").MailEnvelope 
       .Item.Subject = "Reminder- Order(s)/Receipt(s) Pending Your Urgent Approval" 
       .Item.To = Combo.Cells(R_No, 8) 
       .Item.cc = " " 
       If Combo.Cells(R_No, 10) <> "" Then 
        .Item.cc = Combo.Cells(R_No, 12) 
       Else 
       End If 
       .Item.Send 

       Templ.Range("C11") = "" 
       Templ.Range("D11") = "" 
       Templ.Range("E11") = "" 
       Templ.Range("F11") = "" 
       Templ.Range("G11") = "" 
       Templ.Range("C14") = "" 
       Templ.Range("D14") = "" 
       Templ.Range("E14") = "" 
       Templ.Range("F14") = "" 
       Templ.Range("G14") = "" 

       Rows("10:11").Select 
       Selection.EntireRow.Hidden = True 
       Rows("13:14").Select 
       Selection.EntireRow.Hidden = True 
      End With 
     End If 
     R_No = R_No + 1 
    Loop 
End Sub 

回答

8

F11語句的temp1 {ONE}而不是TEMPL。所以確實G11

Templ.Range("E11") = "" 
Temp1.Range("F11") = "" 
+3

隨着G11,F14和G14。 – Inisheer 2013-02-21 16:22:27

+0

@cardmagik很好的接收! – George 2013-02-21 16:28:20

+0

而在其他很多地方.. :) – Lipis 2013-02-21 16:39:30

0

由於cardmagik指出的那樣,你需要(在最後一個號碼一)與Templ更換Temp1(與後面的字母L)。

此外,短短改進的建議對您的代碼:

  • 在您的模塊的開頭總是使用Option Explicit - 這樣一來,你會被告知,如果你拼錯一個變量就像這個例子!
  • 要清空細胞開始​​,只需編寫Temp.Range("C11:G11,C14:G14").Value = "",而不是拼寫出每一個細胞
  • 幾乎所有你X.Select然後Selection.DoSomething,你可以用X.DoSomething取代這個時間 - 更容易閱讀,不太容易出錯,更快地執行
  • 綜合以上兩點,可以簡化
     
    Rows("10:11").Select 
    Selection.EntireRow.Hidden = True 
    Rows("13:14").Select 
    Selection.EntireRow.Hidden = True 
    
    Rows("10:11,13:14").EntireRow.Hidden = True
  • 你有很多重複的代碼。例如,
    Templ.Range("C11") = Combo.Cells(R_No, 2) 
    Templ.Range("D11") = Combo.Cells(R_No, 3) 
    Templ.Range("E11") = Combo.Cells(R_No, 5) 
    Temp1.Range("F11") = Combo.Cells(R_No, 6) 
    Temp1.Range("G11") = Combo.Cells(R_No, 9)
    被稱爲3次 - 如果您考慮第14行非常相似的代碼,甚至6x!相反,用兩個參數創建一個Sub - 並將其稱爲6x!該子看起來是這樣的:
     
    Private Sub FillDefault(rowTarget As Long, rowSource as Long) 
    Templ.Range("C" & rowTarget) = Combo.Cells(rowSource, 2) 
    Templ.Range("D" & rowTarget) = Combo.Cells(rowSource, 3) 
    Templ.Range("E" & rowTarget) = Combo.Cells(rowSource, 5) 
    Templ.Range("F" & rowTarget) = Combo.Cells(rowSource, 6) 
    Templ.Range("G" & rowTarget) = Combo.Cells(rowSource, 9) 
    End Sub 
    
    ,然後用FillDefault 11, R_NoFillDefault 14, R_No
  • 你嵌套IF...THEN...ELSE...聲明是在這個版本中完全沒有意義的稱之爲 - 每條分支都做同樣的! - 只有在一個分支中,您發送電子郵件,除了所有其他步驟!所以這是好多了,以前做其他步驟 - 然後只需發送電子郵件
  • 而不是IF cond1 Then x = 1 Else x = 2可以使用x = Iif(cond1, 1, 2) - 這通常會導致短路代碼,ESP。如果x是較長期的
  • 您的表單是真的叫Templete還是Template
  • 當提到的行數,更好地利用龍,而不是整數的 - 整數只會工作到32,768

所有的一切,我返工你的代碼 - 並減少從高達169行至60行(雖然這可以進一步減少,但爲了可讀性):

Sub Emails() 
    Dim R_No As Long 

    ClearSheet 

    R_No = 2 
    Do Until combo.Cells(R_No, 1) = "" 

     combo.Cells(R_No, 13) = combo.Cells(R_No, 2) & _ 
      IIf(combo.Cells(R_No, 1) <> "Order", " & " & combo.Cells(R_No, 4), "") 

     Select Case combo.Cells(R_No, 1) 
      Case "Order": 
       Rows("10:11").EntireRow.Hidden = False 
       Fill rowTarget:=11, rowSource:=R_No, blnAdd:=(Templ.Range("C11") = "") 
      Case "Receipt": 
       Rows("13:14").EntireRow.Hidden = False 
       Fill rowTarget:=14, rowSource:=R_No, blnAdd:=(Templ.Range("C14") = "") 
     End Select 

     If combo.Cells(R_No, 7) <> combo.Cells(R_No + 1, 7) Then 
      SendMail R_No 
      ClearSheet 
     End If 
     R_No = R_No + 1 
    Loop 
End Sub 

Private Sub ClearSheet() 
    Templ.Range("C11:G11,C14:G14").Value = "" 
    Rows("10:11,13:14").EntireRow.Hidden = True 
End Sub 

Private Sub Fill(rowTarget As Long, rowSource As Long, _ 
    Optional blnAdd As Boolean = False) 
    Dim a As Variant, i As Integer 
    a = Array(2, 3, 5, 6, 9) 
    For i = 0 To 4 
     Templ.Cells(rowTarget, i + 3) = _ 
      IIf(blnAdd, Templ.Cells(rowTarget, i + 3) & Templ.Range("I2"), "") & _ 
      combo.Cells(rowSource, a(i)) 
    Next 
End Sub 

Private Sub SendMail(R_No As Long) 
    Templ.Range("C6") = "Dear " & Left(combo.Cells(R_No, 7), _ 
     InStr(1, combo.Cells(R_No, 7), " ") - 1) & "," 
    Templ.Range("A1:H48").Select 
    ThisWorkbook.EnvelopeVisible = True 

    With ThisWorkbook.Sheets("Templete").MailEnvelope.Item 
     .Subject = "Reminder- Order(s)/Receipt(s) Pending Your Urgent Approval" 
     .To = combo.Cells(R_No, 8) 
     .cc = " " 
     If combo.Cells(R_No, 10) <> "" Then 
      .cc = combo.Cells(R_No, 12) 
     End If 
     .Send 
    End With 
End Sub 

HTH!