2017-12-12 4 views
1

達成しようとしていることは何ですか?VBAにアクセスしてAttachement(QueryDef)付きメールをループに送信

メールアイテムごとに作成しようとしています。このメールアイテムには添付ファイルとしての一時的なクエリが必要です。私は一時的なクエリをフォルダに読み込みます。

問題を示すコードの部分を貼り付けます。

問題はクエリです。それは添付ファイルに常に同じデータを表示し、各rsのデータは表示しません。私は私のループにクエリdefを含める必要があることをお勧めしますが、私はあなたの助けが必要です。

Sub ExcelExportuSenden() 

Dim day As Integer 
day = Weekday(Date, vbSunday) 
Dim olApp As Outlook.Application 
Dim toMulti, waarde As String 
Dim mItem As Outlook.MailItem ' An Outlook Mail item 
Dim dbs As Database 
Dim qdfTemp As QueryDef 
Dim qdfNew As QueryDef 
Dim originalSql As String 
Dim Identified_name As Recordset 
Dim qdf As DAO.QueryDef 
Set dbs = CurrentDb 
Set olApp = CreateObject("Outlook.Application") 
Set mItem = olApp.CreateItem(olMailItem) 
Dim rs As Recordset 

Set rs = CurrentDb.OpenRecordset("Mailversand") 'Get name for the email distro 

If rs.RecordCount > 0 Then 
    rs.MoveFirst 
    Do Until rs.EOF 
     With mItem 
      Set mItem = olApp.CreateItem(olMailItem) 
      .BodyFormat = olFormatHTML 
      toMulti = rs![email] 
      waarde = toMulti 
      For Each qdf In dbs.QueryDefs 
       If qdf.Name = "Anfrage_zur_Ausschreibung" Then 
        dbs.QueryDefs.Delete "Anfrage_zur_Ausschreibung" 
        Exit For 
       End If 
      Next 

      Set qdfTemp = dbs.CreateQueryDef("Anfrage_zur_Ausschreibung") 
      With dbs 
       'Run query on selected Name product manager 
       qdfTemp.SQL = "SELECT * FROM [Filter_Ausschreibung_original] WHERE [Lieferant] = '" & rs![Lieferant] & "'" 
       DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Anfrage_zur_Ausschreibung", "Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx", True 

      End With 

     .To = toMulti 
     MsgBox toMulti 
     .Subject = "Anfrage zu Ausschreibung" 
     .HTMLBody = "Sehr geehrte Damen und Herren" 
     .Display 
     .Attachments.Add ("Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx") 

    End With 

     rs.MoveNext 
    Loop 
Else 
    MsgBox "No email address!" 
End If 
olApp.Quit 
Set olApp = Nothing 
Exit Sub 

End Sub 

結果はどのようなものでしょうか? 各rsには異なる添付ファイルが必要です。 "Lieferant"に属する部分。

実際の結果はどうなりますか? (エラーを含めてください) 私は添付ファイルが1つしかありません。これは常に同じ内容です。

更新 私はパフェのソリューションを使用しようとしています。

'Export temp table to Excel 
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _ 
      "Anfrage_zur_Ausschreibung_TEMP", _ 
      "Q:\LU\_Rothenhöfer\Test\Anfrage_zur_Ausschreibung_TEMP.xlsx", True 

enter image description here

完全なコードは以下のようになります。:

Sub ExcelExportuSenden() 

Dim day As Integer 
day = Weekday(Date, vbSunday) 
Dim olApp As Outlook.Application 
Dim toMulti, waarde As String 
Dim mItem As Outlook.MailItem ' An Outlook Mail item 
Dim dbs As Database 
Dim qdfTemp As QueryDef 
Dim qdfNew As QueryDef 
Dim originalSql As String 
Dim Identified_name As Recordset 
Dim qdf As DAO.QueryDef 
Set dbs = CurrentDb 
Set olApp = CreateObject("Outlook.Application") 
Set mItem = olApp.CreateItem(olMailItem) 
Dim rs As Recordset 

Set rs = CurrentDb.OpenRecordset("Mailversand") 'Get name for the email distro 

If rs.RecordCount > 0 Then 
    rs.MoveFirst 

Do Until rs.EOF 
    With mItem 
     Set mItem = olApp.CreateItem(olMailItem) 
     .BodyFormat = olFormatHTML 
     toMulti = rs![email] 
     waarde = toMulti 

     Set qdfTemp = dbs.CreateQueryDef("Anfrage_zur_Ausschreibung") 
     qdfTemp.SQL = "PARAMETERS LieferantParam Text (255); " & _ 
         "SELECT * INTO Anfrage_zur_Ausschreibung_TEMP " & _ 
         "From Filter_Ausschreibung_original " & _ 
         "WHERE [Lieferant] = rs![Lieferant]" 

     Set qdfTemp = Nothing 

     'Export temp table to Excel 
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _ 
       "Anfrage_zur_Ausschreibung_TEMP", _ 
       "Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx", True 

     .To = toMulti 
     MsgBox toMulti 
     .Subject = "Anfrage zu Ausschreibung" 
     .HTMLBody = "Sehr geehrte Damen und Herren" 
     .Display 
     .Attachments.Add ("Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx") 
    End With 
    rs.MoveNext 
Loop 
Else 
    MsgBox "No email address!" 
End If 
olApp.Quit 
Set olApp = Nothing 
Exit Sub 

End Sub 

私が間違っているのは何の問題は今、次の部分でエラーになりますか?

' UPDATE QUERY 
Set qdfTemp = dbs.CreateQueryDef("Anfrage_zur_Ausschreibung") 
qdfTemp.SQL = "<SQL Query>" 
Set qdfTemp = Nothing     ' RELEASES QUERYDEF 

' EXPORT QUERY TO EXCEL 
DoCmd.TransferSpreadsheet acExport ... 

ただし、SQL文にVBA変数を連結することで、クエリを削除し、再作成のこのアプローチを再考:あなたはそのSQLを更新した後

+0

DoCmdから「データ」を削除するとどうなりますか?このフィールドはインポートのためにpplicableと輸出していない... – Xabier

+0

はい、@ Xabierは正しいと言います。パラメータ 'DATA'は 'Range'用であり、ドキュメントには「... ...スプレッドシートにエクスポートするときにこの引数を空白のままにする必要があります。範囲を入力するとエクスポートは失敗します。また、どこに ".Send"を発行するのかわかりません。 –

+0

@ WayneG.Dunn彼は.Sendの代わりに.Displayを使用しているので、送信前にプレビューすることができます。 – Xabier

答えて

1

単純にそうでなければ変更が伝達されていない、あなたのQTEMPをリリース。より洗練され、保守しやすく、やや効率的なコードのために、Excelをエクスポートするための一時テーブルを反復的に構築するには、parameterizationを検討してください。

SQLPARAMETERS句永久テーブル作成アクションクエリとして保存)

PARAMETERS LieferantParam TEXT; 
SELECT * INTO Anfrage_zur_Ausschreibung_TEMP 
FROM [Filter_Ausschreibung_original] 
WHERE [Lieferant] = [LieferantParam]; 

VBA(ループ部は、現在のパラメータによってアクション上に実行されている)

Do Until rs.EOF  
    With mItem 
     Set mItem = olApp.CreateItem(olMailItem) 
     .BodyFormat = olFormatHTML 
     toMulti = rs![email] 
     waarde = toMulti 

     'Retrieve make-table query and bind parameter to name product manager 
     Set qdfTemp = dbs.QueryDef("Anfrage_zur_Ausschreibung_QUERY") 
     qdfTemp![LieferantParam] = rs![Lieferant] 
     qdfTemp.Execute, dbFailOnError 

     'Export temp table to Excel 
     DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _ 
       "Anfrage_zur_Ausschreibung_TEMP", _ 
       "Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx", True 

     .To = toMulti 
     MsgBox toMulti 
     .Subject = "Anfrage zu Ausschreibung" 
     .HTMLBody = "Sehr geehrte Damen und Herren" 
     .Display 
     .Attachments.Add ("Q:\LU\Test\Anfrage_zur_Ausschreibung.xlsx")  
    End With  
    rs.MoveNext 
Loop 
+0

に属する製品のみを表示する必要があります。私はこれが正しい方法だと思うが、私はそれを使用しようとしているとエラーが発生しました(上記の私の更新を参照してください) – DR1989

+0

これは英語のサイトとしてエラーメッセージを翻訳してください。そしてあなたの実装は私のアプローチとまったく同じではありません。あなたは全くパラメータ化しませんが、 'rs![Lieferant]'を認識できない値であるSQL文字列に直接組み込みます。また、毎回再構築されないストアドクエリとしてクエリを保存することをお勧めします。 VBAで行うのは、パラメータのプレースホルダーへのバインド値だけです。 – Parfait

+0

あなたのアプローチを使うことができますが、不要な 'PARAMETERS'節を削除して、' rs![Lieferant] 'を' WHERE'式の中の文字列に連結します。 – Parfait

関連する問題