2013-02-21 193 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!