Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
新しいデータより前をフィルターすると、新しいデータまでメールに貼り付け られてしまう。
投稿日時: 22/12/19 11:40:39
投稿者: takatada72

お世話になります。
 
コードをネットで確認しながら作っている状態になります。
 
やりたいことは、「DR2更新日」シートで、更新日をフィルターで指定して、そのデータのみ
メールに貼り付けたいと思っております。
 
下記のコードだと、最新更新日より、前の日を指定すると、最新日までのデータが全て出て
きてしまうのです。
※例:12/15を指定するのですが、12/15-12/19までのデータが表示されてしまいます。
 
「DR2更新日」シートは、指定日だけ表示しております。
「DR2Mail」シートの方は、最新日までデータが貼り付けられています。
メールの本文には、「DR2Mail」シートに表示されているデータが貼り付けられております。
 
お忙しいとは思いますが宜しくお願い致します。
 
☆★☆★☆★☆★☆★☆★☆★☆★★☆☆★☆★☆★☆★☆★☆★☆★☆★☆
    Dim objOutlook As Outlook.Application
    Set objOutlook = New Outlook.Application
    Dim objMail As Outlook.MailItem
    Set objMail = objOutlook.CreateItem(olMailItem)
     
    Dim objTableRG As Range
    Dim objWRG As Word.Range
    Dim strPastePos As String
 
    strPastePos = "<表挿入位置>"
      
    '--- メールの内容を格納する変数 ---'
    Dim toStr As String
    Dim ccStr As String
    Dim bccStr As String
    Dim subjectStr As String
    Dim bodyStr As String
    Dim bodyStr1 As String
    Dim bodyStr2 As String
 
     
 'データをコピー
 Worksheets("DR2Mail").Select
  
 Dim c As Range ' 2 行目以降をクリアする:前処理
Dim a,b
Set c = Cells ' シート全体
c.Resize(RowSize:=c.Rows.Count - 1).Offset(1, 0).Clear ' 2 行目以降をクリア
 
 
 Worksheets("DR2更新日").Select
 b = Worksheets("DR2更新日").UsedRange.Rows.Count 'DR2更新日の行数
 
  
  
'DR2更新日のデータを記録
a = Range(Range("A2"), Range("G" & Rows.Count).End(xlUp)).Value 'A-Gまでの情報を取得
 
  
'DR2Mailに新規アイテムのプライズ番号を貼り付ける
 Worksheets("DR2Mail").Select
              Range("H1") = Now 'AAに取り込み日時を記載する
i = 1
For i = 1 To b - 1
Cells(i + 1, 1) = a(i, 1) 'A列に貼り付ける
Cells(i + 1, 2) = a(i, 2) 'B列に貼り付ける
Cells(i + 1, 3) = a(i, 3) 'C列に貼り付ける
Cells(i + 1, 4) = a(i, 4) 'D列に貼り付ける
Cells(i + 1, 5) = a(i, 5) 'E列に貼り付ける
Cells(i + 1, 6) = a(i, 6) 'F列に貼り付ける
Cells(i + 1, 7) = a(i, 7) 'G列に貼り付ける
On Error GoTo tsugi
Next i
'データをコピーここまで
tsugi:
    '--- 宛先の内容 ---'
    toStr = "test_Main@test.com"
    ccStr = "test_Cc@test.com"
      
    '--- 件名の内容 ---'
    subjectStr = "【更新】更新データのの発行 " & Date & " 付DR更新分" '件名
      
    '--- 本文の内容 ---'
      
     'メール本文
    bodyStr = bodyStr + "ご担当者 各位" & Chr(13) & Chr(10)
    bodyStr = bodyStr + "お疲れ様です、データ配信の担当です。" & Chr(13) & Chr(10)
    bodyStr = bodyStr & Chr(13) & Chr(10)
    bodyStr = bodyStr + "メールにて更新状況をお知らせさせていただきま。" & Chr(13) & Chr(10)
    bodyStr = bodyStr + "下記の゛ーテタをご確認頂けますでしょうか" & Chr(13) & Chr(10)
    bodyStr = bodyStr & Chr(13) & Chr(10)
    bodyStr = bodyStr & Chr(13) & Chr(10)
     
    bodyStr2 = bodyStr2 & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 + "以上、よろしくお願いします。" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "■□■□■□■□■□■□■□■□■□■□■□■□" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "株式会社 テスト" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "データ配信部" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "データ配信担当者" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "E-mail:test@test" & Chr(13) & Chr(10)
    bodyStr2 = bodyStr2 & "■□■□■□■□■□■□■□■□■□■□■□■□" & Chr(13) & Chr(10)
 
    bodyStr1 = bodyStr & Chr(13) & Chr(10) & "<表挿入位置>" & bodyStr2
     
      
    '--- 条件を設定 ---'
    objMail.To = toStr
    objMail.CC = ccStr
    objMail.Subject = subjectStr
    objMail.Body = bodyStr1
    objMail.BodyFormat = 3 ' 「3」の場合リッチテキスト型となります。「1」はテキスト型、「2」は HTML型となります。
         
    '--- Excelワークシート ---'
    Dim ws As Worksheet
    Dim 最終行
    最終行 = 0
    Set ws = ThisWorkbook.Worksheets("DR2Mail")
      
    '--- 貼り付ける表の範囲(A1:H10のような文字列) ---'
    Dim tableAddress As String
    'DR2更新日のデータ範囲を取得
     Worksheets("DR2Mail").Activate
     最終行 = Range("A2").End(xlDown).Row
     
    tableAddress = "A1:" & "G" & 最終行
     MsgBox tableAddress
      
      
      
    '--- メール本文に表を貼り付け ---'
    Call ws.Range(tableAddress).Copy
    objMail.GetInspector().WordEditor.Windows(1).Selection.EndKey Unit:=6, Extend:=0
    Set objWRG = objMail.GetInspector.WordEditor.Range(0, 0)
    objWRG.Find.Text = strPastePos
    objWRG.Find.Execute
    objWRG.Paste
     
    '--- メールを表示 ---'
    objMail.Display
     

回答
投稿日時: 22/12/19 12:05:09
投稿者: taitani
投稿者のウェブサイトに移動

何点か。
1.「DR2更新日」並びに、「DR2Mail」のデータ (ダミーで結構)を少しだけ貼り付けてください。
2.

引用:
下記のコードだと、最新更新日より、前の日を指定すると、最新日までのデータが全て出て
きてしまうのです。
※例:12/15を指定するのですが、12/15-12/19までのデータが表示されてしまいます。
  
「DR2更新日」シートは、指定日だけ表示しております。
「DR2Mail」シートの方は、最新日までデータが貼り付けられています。
メールの本文には、「DR2Mail」シートに表示されているデータが貼り付けられております。

 
「最新更新日より、前の日を指定すると、」はどこの部分を変更していますか?
3.実際に貼り付けたいデータがあるシートは、どれですか?
 
4.コードは、sub or function からすべて貼り付けてください。
 
よろしくお願いいたします。

投稿日時: 22/12/19 12:29:55
投稿者: takatada72

早速、ありがとうございました。
 
1番の返答で、ダミーデータになります。
「DR2更新日」のシートで12/16をフィルターしたもので、
「DR2Mail」のシートでは、最新の12/19と12/16が表示されたものになります。
 
プライズ番号    製品名(L)    メーカー(L)    開発担当(L)    発売月(L)    DR開催日    DR更新日        ←DR2更新日
H103553    製品名AA    メーカーG    担当者H    2023/2/1    2022/7/19    2022/12/16        
D105105    製品名BB    メーカーZ    担当者H    2023/3/1    2022/8/16    2022/12/16        
B120177    製品名CC    メーカーC    担当者F    2023/5/1    2022/10/12    2022/12/16        
D105347    製品名DD    メーカーG    担当者I    2023/2/1    2022/10/25    2022/12/16        
                                
                                
                                
                                
プライズ番号    製品名(L)    メーカー(L)    開発担当(L)    発売月(L)    DR開催日    DR更新日        ←DR2Mail
D105572    製品名A    メーカーA    担当者A    2023年1月    2022/8/2    2022/12/19        
D105575    製品名B    メーカーB    担当者A    2023年1月    2022/10/7    2022/12/19        
H103748    製品名D    メーカーC    担当者B    2023年2月    2022/10/12    2022/12/19        
L101197    製品名E    メーカーF    担当者F    2023年2月    2022/11/2    2022/12/19        
D105434    製品名F    メーカーG    担当者G    2023年4月    2022/11/25    2022/12/19        
B103571    製品名G    メーカーD    担当者B    2023年4月    2022/12/2    2022/12/19        
H103553    製品名AA    メーカーG    担当者H    2023/2/1    2022/7/19    2022/12/16        
D105105    製品名BB    メーカーZ    担当者H    2023/3/1    2022/8/16    2022/12/16        
B120177    製品名CC    メーカーC    担当者F    2023/5/1    2022/10/12    2022/12/16        
D105347    製品名DD    メーカーG    担当者I    2023/2/1    2022/10/25    2022/12/16        
 
2番の返答ですが、実際に貼り付けたいデータは、「DR2Mail」のシートになります。
 
3番の返答ですが、コードは、最初に貼り付けた内容が全てになります。
 
なにか、足りない要素があれば、おっしゃって頂けると幸いです。
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 22/12/19 13:07:53
投稿者: taitani
投稿者のウェブサイトに移動

うーむ、なんだろ、うまく伝わらないようですね。
えと、私も一時期陥ったことがありますが、なんでもかんでも VBA で行う必要がありません。
 

下記のコードだと、最新更新日より、前の日を指定すると、最新日までのデータが全て出て
きてしまうのです。
※例:12/15を指定するのですが、12/15-12/19までのデータが表示されてしまいます。

 
は、シートの機能のフィルターでできないですか?
そのあと、メールに貼り付ければ済むかと。
※読み間違ってたらすみません。
 
4.コードは、sub or function からすべて貼り付けてください。

 
これうまく伝わらないかな?
前回の質問で私が貼り付けたように貼っていただければという意味でした。
※BBコード を 「コード」 で処理するといいです。

投稿日時: 22/12/19 13:50:49
投稿者: takatada72

taitaniさん
 
お疲れさまです。
 
なんでもかんでもVBAにしたいので、1クリックでも、削減できたらと言うことと、
他メンバーに行わせるため、なるべく手間を惜しみたいのです。
 
>は、シートの機能のフィルターでできないですか?
こちらは、「DR2更新日」シートでExcel の機能であるフィルターを使って、更新日
を選んでから、その後に今回のコードを実行しております。
 
>4.コードは、sub or function からすべて貼り付けてください。
※選択したシートのデータを選んで、メールに貼り付けるコードは、今回提示した
コードだけです。
下記のコードの一番上は、こちらです。
Private Sub CommandButton46_Click()
           :
. 途中、今回提示したコードになります。
           :
End Sub
 
説明不足でtaitaniさんに伝わっていないのかもしれません。
また、私のVBAの知識が低いと言うことで、taitaniさんが言われている内容が理解
できていないのかもしれません。
 
凡人に質問するようにご記入頂けないでしょうか
 
お忙しいとは思いますが宜しくお願い致します。

回答
投稿日時: 22/12/19 14:06:18
投稿者: taitani
投稿者のウェブサイトに移動

私もうまく伝わらず申し訳ないです。
 

こちらは、「DR2更新日」シートでExcel の機能であるフィルターを使って、更新日
を選んでから、その後に今回のコードを実行しております。

とのことですが、コードでは、
 
i = 1
For i = 1 To b - 1
Cells(i + 1, 1) = a(i, 1) 'A列に貼り付ける
Cells(i + 1, 2) = a(i, 2) 'B列に貼り付ける
Cells(i + 1, 3) = a(i, 3) 'C列に貼り付ける
Cells(i + 1, 4) = a(i, 4) 'D列に貼り付ける
Cells(i + 1, 5) = a(i, 5) 'E列に貼り付ける
Cells(i + 1, 6) = a(i, 6) 'F列に貼り付ける
Cells(i + 1, 7) = a(i, 7) 'G列に貼り付ける
On Error GoTo tsugi
Next i

の動作を行っているので、フィルターで非表示の部分も「DR2Mail」シートへ貼り付けを行っている見解です。
「Microsoft 365」をご利用されているのであれば、データを 「Filter」 関数で対象日だけを表示するとか、
 
上記、For 〜 Next の間に、IF 文で「対象の日かどうか」の判断を行い、「DR2Mail」シートへ貼り付けを行うかのどちらかなって思っています。
 
 

回答
投稿日時: 22/12/19 14:13:41
投稿者: taitani
投稿者のウェブサイトに移動

<追記>
「Microsoft 365」をご利用されているのであれば、データを 「Filter」 関数で対象日だけを表示するとか

 
DR2Mail の B1 セルに
=FILTER(DR2更新日!$A$2:$G$100,DR2更新日!$G$2:$G$100=DATEVALUE("2022/12/16")) など。
※ G 列が 「DR更新日」前提で。

投稿日時: 22/12/19 15:09:04
投稿者: takatada72

taitaniさん
 
ありがとうございます。
 
ここのコードがまずかったのですね
たしかに、フィルターをかけていても、隠れている行を
こちらのコードで指定していたからですね
Cells(i + 1, 1) = a(i, 1) 'A列に貼り付ける
Cells(i + 1, 2) = a(i, 2) 'B列に貼り付ける
Cells(i + 1, 3) = a(i, 3) 'C列に貼り付ける
Cells(i + 1, 4) = a(i, 4) 'D列に貼り付ける
Cells(i + 1, 5) = a(i, 5) 'E列に貼り付ける
Cells(i + 1, 6) = a(i, 6) 'F列に貼り付ける
Cells(i + 1, 7) = a(i, 7) 'G列に貼り付ける
 
taitaniさんが示して頂いたコードを組み込んでみます。
=FILTER(DR2更新日!$A$2:$G$100,DR2更新日!$G$2:$G$100=DATEVALUE("2022/12/16"))
 
引き続き宜しくお願い致します。

回答
投稿日時: 22/12/19 15:26:27
投稿者: taitani
投稿者のウェブサイトに移動

<おまけ>
以下のページも参考になると思います。
 
■絞り込んだ結果をコピーする
http://officetanaka.net/excel/vba/tips/tips155c.htm

投稿日時: 22/12/19 15:41:23
投稿者: takatada72

taitaniさん
 
ありがとうございました。
ヒントを頂いたコードにて、ネットを検索してみました。
下記のコードで、実現できました。
  
 Dim srcSheet As Worksheet
    Dim destSheet As Worksheet
    Dim startRange As String
     
    'コピー元シート
    Set srcSheet = Worksheets("DR2更新日")
    'コピー先シート
    Set destSheet = Worksheets("DR2Mail")
    '表の開始セル
    startRange = "A1"
    hitsuke = "2022/12/14"
     
    With srcSheet.Range(startRange).CurrentRegion
        'コピー元シートの表にオートフィルタを設定してデータを抽出
        .AutoFilter 7, hitsuke
        '抽出した結果をコピー先シートへコピー
        .Copy destSheet.Range(startRange)
        'コピー元シートの表のオートフィルタを解除
        .AutoFilter
    End With

投稿日時: 22/12/19 15:41:31
投稿者: takatada72

taitaniさん
 
ありがとうございました。
ヒントを頂いたコードにて、ネットを検索してみました。
下記のコードで、実現できました。
  
 Dim srcSheet As Worksheet
    Dim destSheet As Worksheet
    Dim startRange As String
     
    'コピー元シート
    Set srcSheet = Worksheets("DR2更新日")
    'コピー先シート
    Set destSheet = Worksheets("DR2Mail")
    '表の開始セル
    startRange = "A1"
    hitsuke = "2022/12/14"
     
    With srcSheet.Range(startRange).CurrentRegion
        'コピー元シートの表にオートフィルタを設定してデータを抽出
        .AutoFilter 7, hitsuke
        '抽出した結果をコピー先シートへコピー
        .Copy destSheet.Range(startRange)
        'コピー元シートの表のオートフィルタを解除
        .AutoFilter
    End With