Excelで2つのファイルデータをマクロで自動的にひとつにする方法

このQ&Aのポイント
  • Excelで2つのファイルのデータを自動的に統合する方法について教えてください。
  • ファイルAとファイルBには同じ名前のデータがあります。ファイルAの名前をもとに、ファイルBの該当する行のデータをファイルAにコピーする方法を教えてください。
  • また、ファイルBには同じ名前が2つ以上登録されている場合には、ファイルAに追加行を作成してデータをコピーしたいです。さらに、ファイルAにファイルBにない名前がある場合には無視し、ファイルBにファイルAにない名前の行を追加したいです。
回答を見る
  • ベストアンサー

パート3★Excelで2つのファイルデータをマクロで自動的にひとつにする方法

こちらで色々と教えていただき、大分解決してまいりましたが まったくの素人でマクロがわからないので是非、教えてください。 また、教えてばかりで申し訳ないので自分で少しマクロを勉強してみたいのですが どこか良いサイトまたは本など、ありましたら教えてください。 エクセルで2つのファイルを自動的にひとつにしました。 ファイルA、ファイルBに【名前が同じ】データがあるとします。  1.ファイルAはA列に【名前】があります。  2.ファイルBはAB列~AP列までのどこかにファイルAと同じ【名前】があります。  3.ファイルAの【名前】を参照して、ファイルBの【名前】がある行のデータを丸ごと   ファイルAの【名前】が一致する行へコピーします。  4.また、ファイルBに同じ【名前】が2つ以上登録されていた場合   ファイルAへコピーするときに、上書きされてしまう恐れがあるので   ファイルAへコピーされる時に行を追加、すぐ下の行にその内容を追加したい。  5.ファイルAの名前が必ずしもファイルBにあるとは限りません。   ファイルAの名前がファイルBにない場合は無視し(空白になる)、次の行へ移動し検索コピーの作業を続けたい。   ファイルBの名前がファイルAにない場合にファイルBの名前の行を丸ごとファイルAの最後の行に追加したい。   ただし、そのファイルBは【太郎】という文字を含むもの(例・山本太郎や山田太郎など)のみにしたい。 ちなみにファイルAにはA~DP列までデータが入っていますので、それ以降にファイルBのデータの行を自動コピーされるようにします。 データが1000件以上あります。 私が今使用しているマクロを下記に記述します。 わかる方いましたら教えてください。 説明がわかりにくくて申し訳ないです。 以上よろしくお願いします。 Sub sample1() On Error GoTo err Dim st1 As Worksheet Dim st2 As Worksheet Set st1 = ActiveSheet Workbooks.Open ("sample1.xls") Set st2 = Workbooks("sample1.xls").Sheets(1) Dim st1maxRow As Long Dim st2maxRow As Long st1maxRow = st1.Cells(st1.Rows.Count, "A").End(xlUp).Row st2maxRow = st2.Cells(st2.Rows.Count, "AB").End(xlUp).Row Dim InsertRow As Long Dim R As Long R = 2 While R <= st1maxRow Dim nmRng As Range If st1.Cells(R, "A").Value <> Empty Then Set nmRng = st2.Range("AB2:AP" & st2maxRow).Find(st1.Cells(R, "A").Value, LookIn:=xlValues) If Not nmRng Is Nothing Then '発見した。 InsertRow = findLoop(st1, st2, R, st2maxRow, nmRng) st1maxRow = st1maxRow + InsertRow - 1 '終了行数を補正 R = R + InsertRow - 1 '検索位置補正 Else Set nmRng = st2.Range("AB2:AP" & st2maxRow).Find("太郎", LookIn:=xlValues) If Not nmRng Is Nothing Then '★ 太郎を発見 InsertRow = findLoop(st1, st2, R, st2maxRow, nmRng) st1maxRow = st1maxRow + InsertRow - 1 '終了行数を補正 R = R + InsertRow - 1 '検索位置補正 End If End If End If R = R + 1 '繰り返し回数を更新 Wend st1.Activate Set st1 = Nothing Set st2 = Nothing Exit Sub err: MsgBox Error End Sub '★ 同じ名前が有る場合行を下に追加してコピー Function findLoop(ByVal st1 As Worksheet _ , ByVal st2 As Worksheet _ , ByVal R As Long _ , ByVal st2maxRow As Long _ , ByVal nmRng As Range) As Long On Error GoTo err findLoop = 0 '追加行数を初期化 Dim stopAddr As String stopAddr = nmRng.Address 'Findの終了判定アドレス Do findLoop = findLoop + 1 '発見回数をカウント If findLoop > 1 Then '複数発見した場合に行を追加 st1.Rows(R + 1).Insert Shift:=xlShiftDown R = R + 1 'ファイルAの格納位置は追加行へ End If '発見した行をCopy st2.Range("A" & nmRng.Row & ":AP" & nmRng.Row).Copy Destination:=st1.Range("DQ" & R) '次を検索 Set nmRng = st2.Range("AB2:AP" & st2maxRow).FindNext(nmRng) If nmRng Is Nothing Then '発見できないので終了 Exit Do End If Loop While nmRng.Address <> stopAddr Exit Function err: MsgBox Error End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • x0000x
  • ベストアンサー率52% (67/127)
回答No.1

こんいちは。 マクロについての学習は、色々な書籍があります。 また、インタネットで検索すると色々なTIPSも公開されているので 個別機能のヒントを見つけ、EXCELのヘルプや書籍で少しずつ理解していけば良いと思います。 EXCELの「新しいマクロの記録」を解析することでもコード内容と操作がイメージし易いかもしれません。 頑張ってください。 やりたい処理はこんな感じで如何でしょうか? ファイルAの名前がファイルBで発見できた場合、ファイルBの「AZ列」に”●”印を付けて識別しました。 この列が不都合であれば、★印の箇所を任意の未使用列に代えてください。 処理終了時のメッセージを追加しました。 Option Explicit Sub sample1() On Error GoTo err Dim st1 As Worksheet Dim st2 As Worksheet Set st1 = ActiveSheet Workbooks.Open ("sample1.xls") Set st2 = Workbooks("sample1.xls").Sheets(1) Dim st1maxRow As Long Dim st2maxRow As Long st1maxRow = st1.Cells(st1.Rows.Count, "A").End(xlUp).Row st2maxRow = st2.Cells(st2.Rows.Count, "AB").End(xlUp).Row 'ファイルAで発見した印をクリア st2.Range("AZ2:AZ" & st2maxRow).Clear '★ Dim nmRng As Range Dim InsertRow As Long Dim R As Long R = 2 While R <= st1maxRow If st1.Cells(R, "A").Value <> Empty Then Set nmRng = st2.Range("AB2:AP" & st2maxRow).Find(st1.Cells(R, "A").Value, LookIn:=xlValues) If Not nmRng Is Nothing Then '発見した。 InsertRow = findLoop(st1, st2, R, st2maxRow, nmRng) st1maxRow = st1maxRow + InsertRow - 1 '終了行数を補正 R = R + InsertRow - 1 '検索位置補正 End If End If R = R + 1 '繰り返し回数を更新 Wend 'ファイルAで検索できなかったファイルBの【太郎】を検索 R = st1maxRow Set nmRng = st2.Range("AB2:AP" & st2maxRow).Find("太郎", LookIn:=xlValues) If Not nmRng Is Nothing Then '太郎を発見 Dim stopAddr As String stopAddr = nmRng.Address 'Findの終了判定アドレス Do If st2.Range("AZ" & nmRng.Row).Value <> "●" Then '★ 'ファイルAの検索外で太郎を発見 COPYする R = R + 1 'ファイルAの格納行位置更新 st2.Rows(nmRng.Row).Copy Destination:=st1.Rows(R) End If '次を検索 Set nmRng = st2.Range("AB2:AP" & st2maxRow).FindNext(nmRng) If nmRng Is Nothing Then '発見できないので終了 Exit Do End If Loop While nmRng.Address <> stopAddr End If '印をクリア st2.Range("AZ2:AZ" & st2maxRow).Clear '★ st1.Activate Set st1 = Nothing Set st2 = Nothing MsgBox "終了しました!" Exit Sub err: MsgBox Error End Sub '★ 同じ名前が有る場合行を下に追加してコピー Function findLoop(ByVal st1 As Worksheet _ , ByVal st2 As Worksheet _ , ByVal R As Long _ , ByVal st2maxRow As Long _ , ByVal nmRng As Range) As Long On Error GoTo err findLoop = 0 '追加行数を初期化 Dim stopAddr As String stopAddr = nmRng.Address 'Findの終了判定アドレス Do findLoop = findLoop + 1 '発見回数をカウント If findLoop > 1 Then '複数発見した場合に行を追加 st1.Rows(R + 1).Insert Shift:=xlShiftDown R = R + 1 'ファイルAの格納位置は追加行へ End If '発見した行をCopy st2.Range("A" & nmRng.Row & ":AP" & nmRng.Row).Copy Destination:=st1.Range("DQ" & R) st2.Range("AZ" & nmRng.Row).Value = "●" '★ '次を検索 Set nmRng = st2.Range("AB2:AP" & st2maxRow).FindNext(nmRng) If nmRng Is Nothing Then '発見できないので終了 Exit Do End If Loop While nmRng.Address <> stopAddr Exit Function err: MsgBox Error End Function

aisu_san3
質問者

お礼

いつもお世話になっております。 回答ありがとうございます。出力がおかげさまでうまくいきました。 またマクロのこともがんばって勉強したいとおもいます。 自分が書いた5番目の説明の仕方が悪く、思ったような出力になりませんでした。 【ファイルBの名前がファイルAにない場合にファイルBの名前の行を丸ごとファイルAの最後の行に追加したい。】 こちらは正しくは 【ファイルBの名前がファイルAにない場合にファイルBの名前の行を丸ごとファイルAのDQ移行に追加したい】 が正しい説明でした。 毎度、お手数おかけいたします。お暇なときに回答いただけると大変たすかります。

その他の回答 (1)

  • x0000x
  • ベストアンサー率52% (67/127)
回答No.2

こんにちは。 >こちらは正しくは >【ファイルBの名前がファイルAにない場合にファイルBの名前の行を丸ごとファイルAのDQ移行に追加したい】 >が正しい説明でした。 「ファイルBの名前の行を丸ごと」は、EXCEL操作で言うところの「行選択&Copy」として解釈しました。 行で選択したデータは行で貼り付け可能ですが、特定のセル以降にCOPYできません。 よって、ファイルBのA:AP列をファイルAのDQ列以降にCOPYするコードに変えるなら、以下のコードとなります。 変更前:st2.Rows(nmRng.Row).Copy Destination:=st1.Rows(R) 変更後:st2.Range("A" & nmRng.Row & ":AP" & nmRng.Row).Copy Destination:=st1.Range("DQ" & R) ※ファイルBの列位置は適当に変更ください。

aisu_san3
質問者

お礼

いつもご回答ありがとうございます。 無事に解決いたしました。本当に色々とおせわになりました。 また何かありましたらよろしくお願いいたします。

関連するQ&A

  • 教えて★ExcelでVBのマクロについて

    以前ここで質問させていただきました。 http://okwave.jp/qa3029622.html 上の内容のとおり教えていただきました。 マクロにさらにタイトルを追加したいのですが可能でしょうか? ファイルAのタイトルは5行目から始まり8行目まであります。 ファイルBのタイトルは2行目から始まり6行目まであります。 ★ファイルAのタイトルにファイルBのタイトルをつけ加えたい! 以下のソースに付け加えるとしたら、どこにどのように追加すればよいですか? 以上ですがよろしくお願いいたします。 Sub findJoin() On Error GoTo err Dim st1 As Worksheet Dim st2 As Worksheet Set st1 = ActiveSheet Workbooks.Open ("870xtd.xls") Set st2 = Workbooks("870xtd.xls").Sheets(1) Dim st1MaxRow As Long Dim st2Maxrow As Long st1MaxRow = st1.Cells(st1.Rows.Count, "A").End(xlUp).Row st2Maxrow = st2.Cells(st2.Rows.Count, "AB").End(xlUp).Row Dim R As Long For R = 2 To st1MaxRow Dim nmRng As Range Set nmRng = st2.Range("AB2:AP" & st2Maxrow).Find(st1.Cells(R, "A").Value, LookIn:=xlValues) If Not nmRng Is Nothing Then '発見した。 st2.Range("A" & nmRng.Row & ":AP" & nmRng.Row).Copy Destination:=st1.Range("DQ" & R) End If Next st1.Activate Set st1 = Nothing Set st2 = Nothing Exit Sub err: MsgBox Error End Sub

  • エクセルのマクロ

    下記のマクロを実行するといつも.Findのところでフリーズしてしまいます。 同じ方法で違うBookからの取込には不具合はないのですが、何故だかわかりません。 ちょっと長くなりますが、どなたか教えてください。 'Function fn_KAKUNIN_Update(strSheetName As String, strInBookName As String) '変数宣言 Dim wksInSheet As Worksheet '入力シート Dim wkbInBook As Workbook '入力ブック Dim wksUpSheet As Worksheet '更新するシート Dim lngKAKUNIN_MaxRow As Long Dim lngSYACHO_MaxRow As Long Dim intMsg As Integer Dim strGenbaNo As String Dim i As Long Dim j As Long Dim rngFind As Range Dim lngStrNo As Long Set wkbInBook = Workbooks(strInBookName) Set wksInSheet = wkbInBook.Worksheets Set wksUpSheet = Workbooks(pstrBookName).Worksheets(strSheetName) fn_KAKUNIN_Update = 1 lngKAKUNIN_MaxRow = wksInSheet.Range("C4").CurrentRegion.Rows.Count lngSYACHO_MaxRow = wksUpSheet.Range("H4").CurrentRegion.Rows.Count lngStrNo = 4 For i = lngStrNo To lngSYACHO_MaxRow strGenbaNo = wksUpSheet.Range("H" & i) With wksInSheet.Range("C4:C" & lngKAKUNIN_MaxRow) Set rngFind = .Find(strGenbaNo, LookIn:=xlValues, MatchCase:=False) If rngFind Is Nothing Then Else

  • エクセル2003マクロの機能追加

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value If Range("A" & 行1).Font.Bold Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する機能を追加したいのです AAAA5 9601  950 BBBB1-1 9660  150 BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375 宜しくおねがいします。

  • マクロ EXCELの範囲をコピーして貼付け2

    【やりたいこと】 エクセルファイル(test.xls)に複数のシートが存在します。 (1)そのエクセルに新しいシートを1つ挿入しシート名を「統合」とつけます。 (2)シート名に「時」という文字が含まれたシートにある表を範囲指定しコピー (3)「統合」シートに貼り付けます。 ※「時」という文字が含まれたシートは複数あります(不特定) 【問題箇所(エラーになっている箇所)・・★】 「時」という文字が含まれたシートは複数枚あるので「統合シート」に貼付ける際 前に貼り付けた続きから貼り付けたいので「統合」シートの最終行を求め、 貼り付けを行っていきたいのですが、最終行を求める箇所でエラーになります。 度々の質問で申し訳ございませんがどなたかご教示頂けないでしょうか。 よろしくお願い致します。 Sub attendanceJoin() Dim MaxRow As Integer Dim wsNewMaxRow As Integer Dim NewWorkSheet As Worksheet Dim ws As Worksheet Workbooks("test.xls").Activate Set NewWorkSheet = Worksheets.Add() '新しいシートを追加 NewWorkSheet.Name = "統合" '新しく追加したシートに「統合」と名前をつける Worksheets("統合").Range("A1").Value = "NO" 'A1のセルに「NO」と入れる For Each ws In Worksheets If ws.Name Like "*時*" Then MaxRow = Worksheets(ws.Name).Range("A4").End(xlDown).Row wsNewMaxRow = Worksheets("統合").Range("A1").End(xlDown).Row '↑★この行でエラー:最終行を求める箇所 With Workbooks("test.xls") .Worksheets(ws.Name).Range("A5:M" & MaxRow).Copy .Worksheets("統合").Range("A" & wsNewMaxRow + 1).PasteSpecial '求めた最終行の次から貼り付けする。 End With End If Next End Sub

  • 対象のシートが3行目からになった修正について

    対象のシートが3行目からになってしまったのですが、修正したいのですが、どこを修正したらよいかが分からず、困っています。お教え頂けませんか。よろしくお願いします。初心者で申し訳ありません。 Sub 統合() Dim J As Long Dim r As Long Dim s As Long Dim Sh As Worksheet Dim MaxRow As Long Dim MaxCol As Long Dim MyArray As Variant Dim JoinSh As Worksheet Set JoinSh = Worksheets("統合") '統合シートを変数に格納 JoinSh.Cells.Delete 'すでに統合シートが存在する場合は一旦セルを削除 s = 1 '最大行を超えた場合次の統合シートを作成するための番号 For i = s + 1 To Worksheets.Count 'シートを統合シートの次~末尾までループ With Worksheets(i) '各月シート If J = 1 Then r = 1 '最初だけ項目も取得 Else r = 1 '最初以外は2行目から取得 End If MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '9列目で最終行を取得 MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column '1行目で最終列を取得 MyArray = Range(.Cells(r, 10), .Cells(MaxRow, MaxCol)) 'A1~データ末尾まで配列に格納 End With With JoinSh '統合シート MaxRow = .Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 If MaxRow + UBound(MyArray) > Rows.Count Then '最大行を超える場合の処理 s = s + 1 '統合シートの番号を加算 Worksheets.Add Before:=Worksheets(s) '新規に統合シートを追加 ActiveSheet.Name = "統合" & s '名前が同じにならないように番号を追加 Set JoinSh = ActiveSheet '統合シートを変数に格納 MaxRow = JoinSh.Cells(Rows.Count, 10).End(xlUp).Row '統合シートの9列目で最終行取得 End If If .Cells(1, 1) = "" Then '最初だけ1行目から貼り付け Range(.Cells(1, 1), .Cells(UBound(MyArray), MaxCol)) = MyArray Else '最初以外は最終行の次に貼り付け Range(.Cells(MaxRow + 1, 1), .Cells(MaxRow + UBound(MyArray), MaxCol)) = MyArray End If End With Next i End Sub

  • エクセルのマクロについて

    下記は、A列3行の7文字目~10文字と B列5行~文字のある最後の行までの範囲の左から1文字目~4文字 に相違がある場合 MsgBox i & “行目” を出す。 というマクロなのですが、『B列5行~文字のある最後の行までの範囲』の中でも『空白のセルに関してはMsgBox不要』というふうに付加えたいのですがどのようにすればよいでしょうか。 Sub Macro1() Dim i As Long Dim sOrgText As String Dim ltotal As Long With ActiveSheet sOrgText = Mid(.Cells(3, 1), 7, 4) ltotal = .Cells(65536, 2).End(xlUp).Row For i = 5 To ltotal If Not Mid(.Cells(i, 2), 1, 4) = sOrgText Then MsgBox i & "行目" End If Next i End With End Sub

  • エクセル2003マクロの再編集

    Sub test() Dim 行1 As Long, 最終行 As Long, 行2 As Long Sheets("Sheet2").Cells.ClearContents Sheets("Sheet1").Activate 最終行 = Range("C65536").End(xlUp).Row 行2 = 1 For 行1 = 1 To 最終行 Sheets("Sheet2").Cells(行2, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Cells(行2, 3).Value = Abs(Sheets("Sheet2").Cells(行2, 3).Value) If Range("A" & 行1).Value = "BBBB1" Then Sheets("Sheet2").Range("A" & 行2) = Range("A" & 行1) & "-1" Sheets("Sheet2").Cells(行2 + 1, 1).Resize(1, 3) = Range(Cells(行1, 1), Cells(行1, 3)).Value Sheets("Sheet2").Range("A" & 行2 + 1) = Range("A" & 行1) & "-2" 行2 = 行2 + 1 End If If Range("A" & 行1) = "" Then 行2 = 行2 - 1 Sheets("Sheet2").Range("C" & 行2) = Sheets("Sheet2").Range("C" & 行2) + Range("C" & 行1) End If 行2 = 行2 + 1 Next 行1 End Sub を編集したいのですが全然図りません ご指導お願いします 元データ AAAA5 9601  950 BBBB1 9660  150 ASAS9 9654  -50 AXCW5 9603  1375 以下の用にマクロで変換する用に出来たのですが 【1】 BBBB1だけではなくAAAA5も対処になったときの 追加方法です 元データは一切変更が出来ません ※フォントの変更も不可です 【2】 元データと変換後データがSheet1からSheet2になっていますが Sheet1の元は範囲はA1~C400で変換後をSheet1E1~G400にしたいのです AAAA5 9601  950  BBBB1-1 9660  150  BBBB1-2 9660  150 ASAS9 9654  50 AXCW5 9603  1375

  • マクロ EXCELの範囲をコピーして貼付け

    『End(xlDown).Row』で取得した値を使ってセルの範囲指定&コピーを行い、 新しく追加したシートに貼り付けたいのですがうまくいきません。 Sub attendanceJoin() Dim MaxRow As Integer 'シートの最終行の値 Workbooks("test.xls").Activate Dim NewWorkSheet As Worksheet Set NewWorkSheet = Worksheets.Add() '新しいシートを追加する MaxRow = Worksheets(2).Range("M1").End(xlDown).Row  'A列の最終行を取得 NewWorkSheet.Name = "統合"  '新しく追加したシートの名前を変更 With Workbooks("test.xls") .Worksheets(2).Range("A1:M&MaxRow").Copy   'コピーするセルの範囲を指定    '↑ここでエラー。.Worksheets(2).Range("A1:M38").Copy を指定するイメージです。 .Worksheets("統合").Range("A1").PasteSpecial End With End Sub どなたか間違っている箇所のご教示お願い出来ますでしょうか。 どうぞよろしくお願い致します。

  • データの平均を1分値にまとめる方法・マクロ

    Windows7 Excel2007を使用しています。 ほぼ 1秒毎のデータの平均を1分値にしてまとめたいです。 しかし量が膨大すぎて、よいやり方をご存知であれば、教えて下さい。 データ形式は下記のようになっています。(列はIVまでありますので、端折ってます。) (時間 2011/9/2 9:19 は一つのセルです。) [LOGGING]     1 2 3 4 5 6 7 8 0 DATETIME     No ア イ ウ エ オ カ キ ク TIME  No ア イ ウ エ オ カ キ ク 2011/9/2 9:19 1 0 1 0 0 0 0 0 0 2011/9/2 9:19 2 0 1 0 0 0 0 0 0 2011/9/2 9:19 3 0 1 0 0 0 0 0 0 2011/9/2 9:19 4 0 1 0 0 0 0 0 0 2011/9/2 9:19 5 0 1 0 0 0 0 0 0 2011/9/2 9:19 6 0 1 0 0 0 0 0 0 2011/9/2 9:19 7 0 1 0 0 0 0 0 0 2011/9/2 9:19 8 0 1 0 0 0 0 0 0 2011/9/2 9:19 9 0 1 0 0 0 0 0 0 2011/9/2 9:19 10 0 1 0 0 0 0 0 0 2011/9/2 9:19 11 0 1 0 0 0 0 0 0 2011/9/2 9:19 12 0 1 0 0 0 0 0 0 2011/9/2 9:19 13 0 1 0 0 0 0 0 0 2011/9/2 9:19 14 0 1 0 0 0 0 0 0 2011/9/2 9:19 15 0 1 0 0 0 0 0 0 上の3行は無視します。 列EXの値に1/10を掛けて、それを1分毎に平均化したいです。 列FBの値に1/1000を掛けて、それを1分毎に平均化したいです。 WorkSheet1 にデータがあった場合、WorkSheet2に上記の平均化した値を表示したいです。 ネットを検索していると、下記に似たような質問と回答のサンプルコードがありました。 これを改良して作ることはできないでしょうか? データが膨大なので、是非マクロを使ってやってみたいと思っています。 www.excel.studio-kazu.jp/kw/20090528191508.html Sub SetAverage() Dim ws1 As Worksheet Set ws1 = Worksheets(1) Dim ws2 As Worksheet Set ws2 = Worksheets(2) Dim averageFormulaC As String Dim averageFormulaD As String averageFormulaC = "=AVERAGE(" & ws1.Name & "!C@S@:C@E@)" averageFormulaD = "=AVERAGE(" & ws1.Name & "!D@S@:D@E@)" Dim i As Long Dim lastRow As Long lastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row ws2.Columns("A:D").Clear ws2.Range("B1").Resize(lastRow, 1).NumberFormatLocal = "hh:mm;@" Dim startRow As Long startRow = 1 Dim currentMin As Long currentMin = Int(ws1.Range("B1").Value * 1440.001) Dim r As Long r = 1 For i = 1 To lastRow If currentMin <> Int(ws1.Cells(i + 1, "B").Value * 1440.001) Then ws2.Range("A" & r).Value = ws1.Cells(i, "A").Value ws2.Range("B" & r).Value = CDbl(currentMin) / 1440# ws2.Range("C" & r).Formula = Replace(Replace(averageFormulaC, "@S@", startRow), "@E@", i) ws2.Range("D" & r).Formula = Replace(Replace(averageFormulaD, "@S@", startRow), "@E@", i) r = r + 1 currentMin = CLng(ws1.Cells(i, "B").Value * 1440.001) startRow = i + 1 End If Next End Sub

  • エクセルマクロで教えてください

    Sub smp05_14_01() Dim 対象セル As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Dim 行 As Long, 列 As Long Dim i As Long Set ws1 = Worksheets("顧客") Set ws2 = Worksheets("売上") Set ws3 = Worksheets("顧客未登録") 行 = ws1.Range("A1").End(xlDown).Row - 1 列 = ws1.Range("A1").End(xlToRight).Column Set 対象セル = ws1.Cells(1, 列 + 2).Resize(2, 行) For i = 1 To 行 対象セル(1, i).Value = "顧客NO" 対象セル(2, i).Value = "<>" & ws1.Cells(i + 1, 1) Next ws2.Range("A1").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=対象セル, _ CopyToRange:=ws3.Range("A1") 対象セル.Clear End Sub 上記のマクロは売上のシートに登録されている以外の顧客NOを顧客シートを参照して顧客未登録シートにコピーするのもですが添付したファイルの数だと上手くいくのですが、エクセルのヨコのセルの最大値の258を越えると上手くいきません。上記の処理で1000レコードを越えても売上シートに登録されている以外の顧客NOを参照して顧客未登録シートにコピーするマクロを教えてください。

専門家に質問してみよう