2013-02-21 2 views
3

Я получил ошибку в приведенной ниже кодировке как объект, требуемый в отмеченной строке. Пожалуйста, помогите мне. Файл Temp означает шаблон, и данные получены из кода Combo, которые являются данными, которые необходимо заполнить в шаблоне, и который отправляет электронные письма на основе приведенного ниже кода.Ошибка визуального базового компилятора

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

+0

@cardmagik приятно поймать! – George

+0

И во многих других местах .. :) – Lipis

0

Как cardmagik отметил, что вам нужно заменить Temp1 (с номером один в конце) с Templ (с буквой L в конце).

Кроме того, всего несколько улучшение предложений по вашему коду:

  • Всегда используйте Option Explicit в начале вашего модуля - таким образом, вам будет сказано, если вы опечатка переменным, как в этом примере!
  • Чтобы очистить ячейки в начале, просто написать Temp.Range("C11:G11,C14:G14").Value = "" вместо изложив каждую клетку
  • Почти все время вы X.Select, а затем Selection.DoSomething, вы можете заменить это X.DoSomething - легче читать, меньше errorprone и быстрее выполнить
  • Сочетание двух указанных выше точки, вы можете упростить
     
    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_No и FillDefault 14, R_No
  • Вашего вложенных IF...THEN...ELSE... заявления совершенно бессмысленно в этой версии - каждая ветвь делает то же самое !!! - только в одном филиале вы отправляете электронное письмо, в дополнение ко всем остальным шагам! Так что гораздо лучше сделать другие шаги раньше - и затем просто отправить по электронной почте
  • Вместо IF cond1 Then x = 1 Else x = 2 вы можете использовать x = Iif(cond1, 1, 2) - это часто приводит к сокращению кода, особенно. если x является более длинным сроком
  • Действительно ли ваш лист Templete или, скорее, Template?
  • При обращении к строке чисел, лучше использовать Long вместо Integer - Целые будет работать только до 32768

В общем, я переработал свой код - и свел его с колоссальным 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!

Смежные вопросы