いつもお世話になっております。
皆さんのお知恵を拝借したく、質問させていただきます。
毎日他の1施設から次のデータが送られてくるとします。
A B C
1 4/1 ←日にち
2 甲 乙 丙 ←品目
3 100 200 300
4 200 400 600
5 300 600 900
実は電子メールで送付されてくるデータをエクセルで次のように集計していたとします。
A B C D
1 甲 乙 丙
2 4/1 600 1,200 1,800 ←合計値等
3 4/2 . . .
4 4/3 . . .
5 4/4 . . .
と、各日の合計値等を入れたいのですが、なんとか毎日送られてくるデータを自動的に取り込む方法はないでしょうか?送付データも集計データもエクセルで、送付データは"20080401"などの日付で送られてきます。これは変更しても構いません。送付データの様式はいつも一定で、数値の個数は毎回違っています。
表の数値がずれてしまい、見ずらくてすみません・・・
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
>実はこの集計データは月別にシーツが分かれています。
データを開いて調べてから対象シートを設定する必要があるので、以下のようになる。
シート名の月が半角の場合と全角の場合(4月と4月)があるので、どちらかを有効にする。
Sub sample()
Dim ws As Worksheet
Dim file As Variant
Dim r As Long
Dim c As Long
'ChDir ThisWorkbook.Path '[ファイルを開く]ダイアログボックスの最初のフォルダをこのブックと同じフォルダに(以下に各種フォルダの場合)
'ChDir "c:\" '指定パス
'ChDir CreateObject("WScript.Shell").SpecialFolders("MyDocuments") 'マイ ドキュメント
'ChDir CreateObject("WScript.Shell").SpecialFolders("Desktop") 'デスクトップ
file = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If file = False Then Exit Sub
Application.ScreenUpdating = False
With Workbooks.Open(file)
With .Sheets(1) 'データのあるシートは先頭のシートの場合
'With .ActiveSheet 'データのあるシートはアクティブシートの場合
'Set ws = ThisWorkbook.Sheets(Month(.Range("A1")) & "月") '月が半角の場合
Set ws = ThisWorkbook.Sheets(StrConv(Month(.Range("A1")), vbWide) & "月") '月が全角の場合
r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
c = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
.Range("A1").Copy Destination:=ws.Cells(r, 1)
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).Formula = "=SUM([" & .Parent.Name & "]" & .Name & "!A3:A" & .Rows.Count & ")"
End With
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).Copy
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).PasteSpecial xlPasteValues
Application.CutCopyMode = False
.Close
End With
Application.ScreenUpdating = True
End Sub
No.3
- 回答日時:
No1です。
VBAをご存知のようなので、MS-OUTLOOKに入れるVBAをひとつ紹介しておきます。
OUTLOOKのVBエディター開いて以下、コピィしてみてください。
メールを受信添付ファイルを保存、確認のメールを返信までが自動になります。
準備として
受信の際に、データのメールの場合は、件名、或いは送信者名なので
そのメールのみ 別のトレイへ移動するように自動仕訳のウィザードで
設定しておきます。
以下では、データのメール受信されると データフォルダ というフォルダを作成し移動する設定の場合です。
データフォルダのメールを参照して、添付ファイル名が
新規データ.xls の場合は A:へ保存してお礼のメールを返信します。
動作確認はしていませんが、VBAを順に確認してもらうと流れがわかるかと思います。
全てが必要ではないと思いますが、そちらの状況に合わせて設定してみてください。
Private Sub Application_NewMail() '新規メール受信時のイベント
Dim myItem As Outlook.MailItem ' MailItemオブジェクト
Dim myFolder As Outlook.MAPIFolder ' MAPIFolderオブジェクト
Dim myNameSpace As Outlook.NameSpace ' NameSpaceオブジェクト
' NameSpaceオブジェクトの取得
Set myNameSpace = Application.GetNamespace("MAPI")
' 「受信トレイ」のオブジェクトを取得
Set myMailFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
' 「データフォルダ」というサブトレイのオブジェクトを取得
Set myFolder = myMailFolder.Folders("データフォルダ")
' 「データフォルダ」フォルダ内のすべてのアイテム数ループ
For i = 1 To myFolder.Items.Count
' MailItemオブジェクトを取得
Set myItem = myFolder.Items(i)
' 未読のメールのみに処理を行なう
If myItem.UnRead = True Then
' 添付ファイルを保存
Set myAttachments = myItem.Attachments
c = myItem.Attachments.Count
For CLE = 1 To c
If myAttachments.Item(CLE).DisplayName = "新規データ.xls" Then
'サンプルでは、添付ファイル名が新規データの名前の場合です。
myAttachments.Item(CLE).SaveAsFile "A:\" & myAttachments.Item(CLE).DisplayName
'サンプルではA:\に保存です。
MsgBox("新しいデータを保存しました", vbOKOnly, "データ保存")
' 返信用オブジェクトを作成
Set myReply = myItem.Reply
' 件名と本文を設定
myReply.Subject = "データを受け取りました"
myReply.Body = "本日のデータ、確かに受け取りました。ありがとうございます"
' 返信を送信
myReply.Send
End If
Next
' メッセージを既読に設定
myItem.UnRead = False
End If
Next i
End Sub
返答ありがとうございます。
色々おしえていただき参考になりました。
マクロだと色々できてもっと勉強していきたいと思っております。
No.2
- 回答日時:
送付されてくるデータのあるフォルダとシート名、集計するシート名など不明な点があるので、必要に応じて修正して下さい。
Sub sample()
Dim ws As Worksheet
Dim file As Variant
Dim r As Long
Dim c As Long
ChDir ThisWorkbook.Path '[ファイルを開く]ダイアログボックスの最初のフォルダをこのブックと同じフォルダに(以下に各種フォルダの場合)
'ChDir "c:\" '指定パス
'ChDir CreateObject("WScript.Shell").SpecialFolders("MyDocuments") 'マイ ドキュメント
'ChDir CreateObject("WScript.Shell").SpecialFolders("Desktop") 'デスクトップ
file = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If file = False Then Exit Sub
Set ws = ThisWorkbook.Sheets("Sheet1") '集計するシート名を指定
'Set ws = ThisWorkbook.ActiveSheet '集計するシートは現在のシート
r = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
c = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = False
With Workbooks.Open(file)
With .Sheets(1) 'データのあるシートは先頭のシートの場合
'With .ActiveSheet 'データのあるシートはアクティブシートの場合
.Range("A1").Copy Destination:=ws.Cells(r, 1)
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).Formula = "=SUM([" & .Parent.Name & "]" & .Name & "!A3:A" & .Rows.Count & ")"
End With
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).Copy
ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).PasteSpecial xlPasteValues
Application.CutCopyMode = False
.Close
End With
Application.ScreenUpdating = True
End Sub
この回答への補足
教えていただきありがとうございます。返事遅れてすみませんでした。実はさらに教えていただきたいことがあるのですが、実はこの集計データは月別にシーツが分かれています。「4月」の集計シート、「5月」の集計シートと言う感じでです。そういう場合はさらにVBAも複雑になるのでしょうか?私なりにArrayを使うのかな・・・と考えて色々入れてみたのですがなかなか上手くいきませんでした。教えていただければ幸いです。
補足日時:2008/06/09 18:01No.1
- 回答日時:
作業の流れを以下のように考えるとシンプルかと思います。
1、送られてくるデータを日次データ とでもします(ファイル名は固定でよいでしょう)
2、日次データ 以下のようにしておきます。
A B C D
1 日付 担当 品名 数量
2 4/1 A 甲 100
3 4/1 B 乙 200
4 4/1 A 丙 300
5 4/1 C 甲 300
・・・ とかします。
3、受信する方のパソコンにも同様のファイルを作成します(仮にメインデータ)
4、マクロを作成します。
例えば、受信した日次データを開くと
自動でマクロが実行される。
日次データのデータ部分をコピィ
メインデータを開いて、データの最終行以降に貼り付ける
メインデータを上書き保存して終了する
5、メインデータのブックに集計のシートを作成しておきて、
日付ごとに 合計が集計されるようにしておく。
このようにしておけば、毎日、受信した添付ファイルを開くだけの作業ですみます。
データの量によっては、メインデータのファイルをアクセスに致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- 数学 賃料と専有面積のデータが60部屋分ほどがあり、 賃料÷専有面積(=1㎡あたりの賃料)の数式で計算する 2 2023/02/18 20:33
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
- Excel(エクセル) 【エクセル」 特定のセルで条件抽出した列を、別シートに上から詰めて表示したい。 8 2022/04/08 16:00
- Excel(エクセル) EXCEL値貼り付け(ある条件のもと自動化) 5 2023/06/06 12:21
- Excel(エクセル) 数式→数値固定する方法ありますか? 5 2023/06/18 15:22
- Excel(エクセル) Excelでのデータ管理 6 2022/12/24 09:33
- Excel(エクセル) エクセルデータの集計、一つのセルに複数のデータがある場合 7 2022/12/28 20:19
- Excel(エクセル) エクセルで、ファイルの分割 と ファイルの集約 1 2022/08/28 08:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
複数シートからデータを拾って...
-
excelの不要な行の削除ができな...
-
シート削除して同名シート追加...
-
トランジスタの選び方
-
VBAで CTRL+HOMEの位置へ移動...
-
Excelで日付変更ごとに、自動的...
-
毎日送られてくるデータをエク...
-
エクセルのカメラ機能について
-
ExcelマクロのSendkeysで処理途...
-
EXCEL の表を一行ずつシートに...
-
Excelマクロ 差分抽出の方法が...
-
ユーザーフォームで別シートを...
-
Excelでテーブルを2次元の表に...
-
EXCEL グラフ作成 データの範...
-
エクセルで一覧表から担当別シ...
-
エクセルVBAで、特定文字から始...
-
Excelのセル横にリスト表示をす...
-
エクセル 縦に長い表の印刷時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数シートからデータを拾って...
-
excelの不要な行の削除ができな...
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
シート削除して同名シート追加...
-
Excelで日付変更ごとに、自動的...
-
VBAで CTRL+HOMEの位置へ移動...
-
【エクセルマクロ】複数シート...
-
トランジスタの選び方
-
EXCEL 複数行のデータを1行にま...
-
EXCELで2つのファイルから重複...
-
別々のシートの表をピボットテ...
-
エクセル VBA VLOOKUP
-
他のシートの一番下の行データ...
-
エクセルのカメラ機能について
-
時間帯の重複を除いた集計について
-
EXCEL の表を一行ずつシートに...
-
ファンモータが作動しない。
-
エクセルで名簿を50音で切り分ける
-
エクセル マクロ "特定の日付...
おすすめ情報