質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

4回答

1185閲覧

VBA メールの送り方について

shunsuke_0319

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2021/10/30 23:56

編集2021/10/31 02:51

再度修正しました
VBAで専用かつINSの時にメールをsyunsukeに送りたいのですがこれだとaquarius0319にしか行きません なぜでしょうか?

VBA

1Sub 最終sample() 2Const olMailItem = 0 3Dim file As String 4Dim pr As Presentation 5Dim sl As Slide 6Dim sh As Shape 7Dim tb As Table 8Dim r As Integer 9Dim c As Integer 10Dim s As String 11Dim t As String 12 13Dim f1 As Boolean 14Dim f2 As Boolean 15Dim ol As Object 16Dim mail As Object 17Dim f As Object 18Dim dic As Object 19Dim k As Variant 20Dim n As Variant 21Dim mailTo As String 22 23With Application.FileDialog(msoFileDialogOpen) 24.Filters.Clear 25.Filters.Add "ppt", "*.ppt?" 26.InitialFileName = "C:\" 27.AllowMultiSelect = False 28If Not .Show Then Exit Sub 29file = .SelectedItems(1) 30End With 31 32Do 33Set pr = Presentations.Open(file) 34For Each sl In pr.Slides 35f1 = False 36f2 = False 37For Each sh In sl.Shapes 38If sh.HasTable Then 39Set tb = sh.Table 40For r = 1 To tb.Rows.Count 41For c = 1 To tb.Rows(r).Cells.Count 42s = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text 43t = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text 44'宛先 45If InStr(s, "専用") > 0 And InStr(t, "INS") > 0 Then 46f1 = True 47mailTo = "syunsuke" 48End If 49If InStr(s, "フレッツ") Then 50f1 = True 51mailTo = "b230420" 52End If 53If InStr(s, "INS") Then 54f1 = True 55mailTo = "b230420" 56End If 57If InStr(s, "専用") Then 58f1 = True 59mailTo = "aquarius0319" 60End If 61 62If InStr(s, "秋田") And r < tb.Rows.Count Then 63If IsNumeric(tb.Rows(r + 1).Cells(c).Shape.TextFrame2.TextRange.Text) Then f2 = True 64End If 65If f1 And f2 Then Exit Do 66Next 67Next 68End If 69Next 70Next 71MsgBox "無かった" 72Loop Until True 73pr.Close 74 75If Not (f1 And f2) Then Exit Sub 76' 77MsgBox "見つけた" 78 79Set ol = CreateObject("Outlook.Application") 80Set mail = ol.CreateItem(olMailItem) 81mail.Display 82 83mail.To = mailTo '宛先 84mail.Subject = "件名" 85mail.Body = "本文" 86 87'添付ファイル 88mail.Attachments.Add file 89 90'添付ファイル 91With Application.FileDialog(msoFileDialogOpen) 92.Filters.Clear 93.Filters.Add "添付ファイル", "*.*" 94.InitialFileName = "C:\" 95.AllowMultiSelect = True 96If .Show Then 97Dim o As Integer 98For o = 1 To .SelectedItems.Count 99mail.Attachments.Add .SelectedItems(o) 100Next 101End If 102End With 103 104'メール送信 105mail.Send '送信 106 107ol.Quit 108 109End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/10/31 00:56

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
cx20

2021/10/31 01:35

(主に回答者向けの情報です) VBA のコードを見やすく整形してくれるサイトがあるようです。構文の色付けもされるので多少読みやすくなります。 https://www.automateexcel.com/vba-code-indenter/
shunsuke_0319

2021/10/31 02:19

ありがとうございます 修正させていただきました
cx20

2021/10/31 02:28 編集

残念ながら質問文のコード整形が解消していないようです。ソースコードの前後を「```」で囲む必要があります。 <コードブロックの記入例> ```VBA ソースコード ```
shunsuke_0319

2021/10/31 02:40

cx20様 ありがとうございます 修正させていただきました
cx20

2021/10/31 02:41

修正ありがとうございます。インデントが付いていた状態でコード記載して頂けるとより見やすくなるかと思います。
ken3memo

2021/10/31 04:45

素朴な疑問だけど、 ループを作り、パワーポイント内の表・テーブルのtb.Rows(r).Cells(c)でテキストを取り出し VBAで 専用かつINSの時に メールをsyunsukeに送りたい 仕様だと思いますが、 Set tb = sh.Table For r = 1 To tb.Rows.Count For c = 1 To tb.Rows(r).Cells.Count s = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text t = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text '宛先 If InStr(s, "専用") > 0 And InStr(t, "INS") > 0 Then ↑変数sとtが同じ場所を(同じ値なのでは?) s = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text t = tb.Rows(r).Cells(c).Shape.TextFrame2.TextRange.Text で 専用かつINSの時って? あっ、"INSxxxx専用"とか"xx専用xxINS"のデータをチェックしている場合もあるか。 sとtに変数を分けているので、別の場所(隣や下のセルなど)を参照したいのかと、深読みしてみた。 なんて、やりたいこと・仕様を勝手に想像すると、痛い目見るので、 ※実データは無理だとおもいますが、  例題の表があると(テストの表があると)  ズバリの回答が得られやすいかも。。 ※※過去質問に書いてあったらすみません。 長々、コメント書いたけど、 一言、 表の値・条件を書いてください ^^^^^^^^^^^^^^^^^^^^^^^^ と言えばヨカッタかも。
guest

回答4

0

VBAで専用かつINSの時にメールをsyunsukeに送りたいのですがこれだとaquarius0319にしか行きません なぜでしょうか?

・elseif にしてないので情報が上書きされている
・InStrの戻り値は数値なのに、booleanとして判定に使用している。※0=false 0以外=Trueとして判断されているのを利用しているとは思いますが、あまり宜しくは無いと思います。

他にもあるでしょうけど、段下げなどしていない見辛いコードなので。
その点も改善された方が良いかと思います。

投稿2021/10/31 04:07

編集2021/10/31 04:19
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

VBA

1Option Explicit 2 3Function openPresentation() As Presentation 4With Application.FileDialog(msoFileDialogOpen) 5.Filters.Clear 6.Filters.Add "ppt", "*.ppt?" 7.InitialFileName = "C:\" 8.AllowMultiSelect = False 9If Not .Show Then Exit Function 10Set openPresentation = Presentations.Open(.SelectedItems(1)) 11End With 12End Function 13 14Function getFiles() As Collection 15Dim co As New Collection 16With Application.FileDialog(msoFileDialogOpen) 17.Filters.Clear 18.Filters.Add "添付ファイル", "*.*" 19.InitialFileName = "C:\" 20.AllowMultiSelect = True 21If Not .Show Then Exit Function 22Dim i As Integer 23For i = 1 To .SelectedItems.Count 24co.Add .SelectedItems(i) 25Next 26End With 27Set getFiles = co 28End Function 29 30 31Sub お試し最終sample() 32Const olMailItem = 0 33Dim file As String 34Dim pr As Presentation 35Dim sl As Slide 36Dim sh As Shape 37Dim tb As Table 38Dim r As Integer 39Dim c As Integer 40Dim s As String 41Dim f0 As Boolean 42Dim f1 As Boolean 43Dim f2 As Boolean 44Dim f3 As Boolean 45Dim f4 As Boolean 46Dim f5 As Boolean 47Dim mailto As Object 48Dim m As Variant 49Dim att As Variant 50Dim ol As Object 51Dim mail As Object 52Set mailto = CreateObject("Scripting.Dictionary") 53Set pr = openPresentation 54Do 55For Each sl In pr.Slides 56For Each sh In sl.Shapes 57If sh.HasTable Then 58Set tb = sh.Table 59For r = 1 To tb.Rows.Count 60For c = 1 To tb.Rows(r).Cells.Count 61s = tb.Cell(r, c).Shape.TextFrame2.TextRange.Text 62If InStr(s, "秋田") > 0 Then 63If r <> tb.Rows.Count Then 64If IsNumeric(tb.Cell(r + 1, c).Shape.TextFrame2.TextRange.Text) Then f0 = True 65End If 66End If 67If InStr(s, "専用") > 0 Then f1 = True 68If InStr(s, "フレッツ") > 0 Then f2 = True 69If InStr(s, "INS") > 0 Then f3 = True 70If InStr(s, "BEW") > 0 Then f4 = True 71If InStr(s, "メタル") > 0 Then f5 = True 72'ifでいくらでも条件追加 73' 74If f0 And f1 Then 75If f3 Then 76mailto.Add "syunsuke", Null '秋田と専用とINS 77Else 78mailto.Add "aquarius0319", Null '秋田と専用(INS無し) 79End If 80End If 81If f0 And f2 Then mailto.Add "b230420", Null '秋田とフレッツ 82If mailto.Count > 0 Then Exit Do 83Next 84Next 85End If 86If f0 And f3 Then mailto.Add "suzuki", Null '秋田とINS 87If mailto.Count > 0 Then Exit Do 88Next 89Next 90If f0 And f4 Then mailto.Add "okumura", Null '秋田とBEW 91If mailto.Count > 0 Then Exit Do 92If f0 And f5 Then mailto.Add "kato", Null '秋田とメタル 93If mailto.Count > 0 Then Exit Do 94'If f0 And f5 Then mailto.Add "kato", Null '秋田とメタル 95'If mailto.Count > 0 Then Exit Doでいくらでも条件追加 96Loop Until True 97pr.Close 98If mailto.Count = 0 Then Exit Sub 99' 100MsgBox Join(mailto.keys, vbCrLf) & vbCrLf & vbCrLf & "にメールを送ります。" 101For Each m In mailto.keys 102MsgBox "送付先:" & m 103Set ol = CreateObject("Outlook.Application") 104Set mail = ol.CreateItem(olMailItem) 105mail.Display 106mail.To = m '宛先 107mail.Subject = "件名" 108mail.Body = "本文" 109For Each att In getFiles 110 '添付ファイル 111mail.Attachments.Add att '添付ファイル 112Next 113With Application.FileDialog(msoFileDialogOpen) 114 .Filters.Clear 115 .Filters.Add "添付ファイル", "*.*" 116 .InitialFileName = "C:\" 117 .AllowMultiSelect = True 118 If .Show Then 119 Dim o As Integer 120 For o = 1 To .SelectedItems.Count 121 mail.Attachments.Add .SelectedItems(o) 122 Next 123 End If 124 End With 125mail.Send '送信 126Next 127End Sub 128

投稿2021/10/31 04:47

shunsuke_0319

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

vba

1If InStr(s, "専用") > 0 And InStr(t, "INS") > 0 Then 2 f1 = True 3 mailTo = "syunsuke" 4ElseIf InStr(s, "フレッツ") Then 5 f1 = True 6 mailTo = "b230420" 7ElseIf InStr(s, "INS") Then 8 f1 = True 9 mailTo = "b230420" 10ElseIf InStr(s, "専用") Then 11 f1 = True 12 mailTo = "aquarius0319" 13End If 14

投稿2021/10/31 03:54

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

>メールをsyunsukeに送りたいのですがこれだとaquarius0319にしか行きません なぜでしょうか?

'宛先 If InStr(s, "専用") > 0 And InStr(t, "INS") > 0 Then f1 = True mailTo = "syunsuke" mailTo = "aquarius0319" End If

↑宛先toに二件連続で変数に入れてますが、これだと最後のaquarius0319しか変数に残りません

; セミコロンで複数の宛先を指定すると良いのでは?

mailTo = "syunsuke"
mailTo = "aquarius0319"

mailTo = "syunsuke; aquarius0319"
にすると良いのでは?

'宛先 If InStr(s, "専用") > 0 And InStr(t, "INS") > 0 Then f1 = True mailTo = "syunsuke; aquarius0319" End If

参考

https://support.microsoft.com/ja-jp/office/%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-147208af-ca8e-4cdf-b71f-77ba81a54069

https://dekiru.net/article/20630/

投稿2021/10/31 01:05

ken3memo

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunsuke_0319

2021/10/31 01:08

やってみたのですがそれでもaquarius0319にしかいきませんでした‥
ken3memo

2021/10/31 01:13

shunsuke_0319 さん mailTo = "syunsuke" もしかして、スペルミスとかないですよね? shunsuke syunsuke それは、さすがにないか。コードを見やすくUPすると、他の方が回答したくなるともいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問