• ベストアンサー

エクセルVBAについて(オートフィルタ&シート名変更&コピー&貼り付け)

sheet1にデータがあります。sheet2にフォーマットがあります。 sheet1は、 A1:店名 B1:種別 C1:管轄 D1:9時 E1:10時 F1:11時・・・R1:23時 ●●店 新規  東京  0 5 3・・・2 ●●店 解約  東京  1 2 1・・・0 ▲▲店 新規  大阪  0 1 1・・・2 ▲▲店 解約  大阪  0 1 3・・・1 ◆◆店 新規  福岡  1 3 0・・・2 ◆◆店 解約  福岡  0 1 1・・・0 ↓ずらっと各店舗毎のデータが並んでいます。 sheet2は、フォーマットになっているので、 まず、sheet2のフォーマットのシートをコピーし、 sheet1のデータをフィルタで検索し、そのセルD1:R1の項目データをコピーし、 sheet2の決まった場所(セルD33:R34)へ値貼り付け、シート名を店名に変更し、ファイル名は管轄名で保存する。 これを自動で全データ分ファイル分けしたいです。数が多くて一つ一つしていくと時間がかかりとても時間がかかりすぎます。 データから店舗名分シートを増やしていき、各データを値貼り付け、最終的には管轄でまとめて保存したいのです。 自動記録までわかるのですが、一つの自動記録を繰り返すことが、初心者でしてわかりません。VBAを使って訂正することが難しいので、どうぞよろしくお願い致します。

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

  • ベストアンサー
  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.2

A1からA40まで上から順になめていき、40まで行かなくても空白になったら(最後の行で)処理をとめたいのであれば、 Dim i As Integer 'Dim ArrayCol(40) As String For i = 1 To Worksheets("Sheet1").Cells(1, 1).End(xlDown).Row ' ArrayCol(i) = Worksheets("Sheet1").Cells(i, 1).Value '----------------- 'この位置に繰り返す処理を記述 '----------------- ' If i = 40 Then Exit For Next i あえてArrayColを使う必要も無いのですが、どうしても店名をメモリ上に確保しておきたければ、上のソースの3行のコメントを外せばOKです。 さぞお困りのことと存じますが、昨夕の質問 http://okweb.jp/kotaeru.php3?q=1235858 と合わせ見てみると、おそらく上のアドバイスでは問題は解決しない、というか、miechinさんの必要なマクロを自力で完成するのは、失礼ながら困難であろうと思われます。土日で良ければご満足のゆくマクロを作っても良いのですが、それでOKであれば、補足欄にでもその旨記入しておいて下さい。書ききれていない要望があったらついでに書いておいて下さい。

miechin
質問者

補足

ご回答ありがとうございます。ただ今、混乱して苦戦しています。 もし、お時間いただいて作成していただけるのなら、よろしくお願いいたします。無理をいって申し訳ございません。とても嬉しいです。 追加事項は、>sheet2の決まった場所(セルD33:R34)へ値貼り付け、 その後、その部分の並び替え(降順)をしたいです。 よろしくお願いいたします。

その他の回答 (2)

  • matsu_jun
  • ベストアンサー率55% (146/265)
回答No.3

完成しましたので記載します。ただ補足の > その後、その部分の並び替え(降順)をしたいです。 というのが少々分かりません。何を(どの列を)キーに降順に並べるのでしょう? 質問文から、各店毎に「新規」と「解約」の2行ずつあるようなので、「新規」を33行目に、「解約」を34行目に挿入するようにしてみましたが、いかがでしょうか? 下のソースを標準モジュールに貼り付けてもらえば動作すると思います。シートの名前や各項目の列・行について、簡単に変更できるようにしてあります。 直接細かく仕様を伺ったり、入ってくるデータの個数などについて細かく打ち合わせれば、より細かなエラーチェックや動作の高速化が図れますが、このソースでは、極力エラーが発生しないような作りをしている関係上、動作が非常に遅く(処理がまだるっこしく)なっております。データ量にもよりますが、実行に最悪数分かかるかもしれません。それで問題なければご利用ください。 'ここから-------------------------------------------------------------------------------------- Sub データ編集() '動作内容------------------------------------------------------------------- '本マクロを実行することで、データを整理します。 '本ブックのあるフォルダに"年月日時分秒"(YYYYMMDDhhmmss)という名前のフォルダを作成し、 'その中にデータを挿入してゆきます。 '--------------------------------------------------------------------------- '変更可能な変数の定義------------------------------------------------------- '以下を変更することで、動作方法を変更することができます。 データシート名$ = "Sheet1" 'データ入力シートのシート名です。""の中身を自由に変更できます。 テンプシート名$ = "Sheet2" 'テンプレートシートのシート名です。""の中身を自由に変更できます。 管轄列$ = "C" '管轄が記入されている列です。""の中身をAからZまで変更できます。 店名列$ = "A" '店名が記入されている列です。""の中身をAからZまで変更できます。 種別列$ = "B" '新規・解約の別が記入されている列です。""の中身をAからZまで変更できます。 開始列$ = "D" 'データコピーを開始する列です。""の中身をAからZまで変更できます。 終了列$ = "R" 'データコピーを終了する列です。""の中身をAからZまで変更できます。 新規行# = 33 '新規件数を記入する行です。= の後ろを自由に変更できます。 解約行# = 34 '解約件数を記入する行です。= の後ろを自由に変更できます。 '--------------------------------------------------------------------------- '使用上の注意点------------------------------------------------------------- '・上の2つのシート以外にシートがあっても構いません。本ソフトはそれを無視します。 '・データシートは2行目から始まるものとします。1行目はタイトル(項目名)と考えます。 '・店舗名および管轄名には、以下の制約があります。 '  ・":"、"\"、"/"、"?"、"*"、"["、"]"、"."の8種類の文字は使ってはいけません。 '  ・店舗名および管轄名は未記入(空白)ではいけません。 '  ・文字数が31文字を超えてはいけません。 '・33行目にその店舗の「新規」データが、34行目にその店舗の「解約」データが挿入されます。(初期値) '--------------------------------------------------------------------------- '変更不可な変数の定義------------------------------------------------------- Dim FILE_PATH As String '本ファイルのパス Dim FILE_FLD As String 'データ格納フォルダ名 Dim FULL_PATH As String 'データ格納フォルダのパス Dim CHK_LINE As Long 'チェック行 Dim DB_WS As Worksheet 'データ入力シート名 Dim TP_WS As Worksheet 'テンプレートシート名 Dim COLALL(5) As Integer '列情報(COLALL(1)=管轄列、COLALL(2)=店名列、COLALL(3)=種別列) Dim ROWALL(2) As Long '行情報(ROWALL(1)=新規行、ROWALL(2)=解約行) Dim ERRSTR(8) As String '禁則文字 '--------------------------------------------------------------------------- On Error GoTo ERREND Set DB_WS = Worksheets(データシート名) Set TP_WS = Worksheets(テンプシート名) COLALL(1) = Asc(LCase(管轄列)) - 96 COLALL(2) = Asc(LCase(店名列)) - 96 COLALL(3) = Asc(LCase(種別列)) - 96 COLALL(4) = Asc(LCase(開始列)) - 96 COLALL(5) = Asc(LCase(終了列)) - 96 ROWALL(1) = 新規行 ROWALL(2) = 解約行 ERRSTR(1) = ":" ERRSTR(2) = "\" ERRSTR(3) = "/" ERRSTR(4) = "?" ERRSTR(5) = "*" ERRSTR(6) = "[" ERRSTR(7) = "]" ERRSTR(8) = "." 'あらかじめオープンしているブック、管轄名、店舗名に対してエラーチェックを行う If Workbooks.Count <> 1 Then MsgBox ("他のワークブックを閉じてから再実行してください") Exit Sub End If For CHK_LINE = 2 To DB_WS.Cells(65535, COLALL(1)).End(xlUp).Row Dim ErrFlug As Boolean ErrFlug = False For i# = 1 To 2 If DB_WS.Cells(CHK_LINE, COLALL(i)).Value = Empty Then DB_WS.Cells(CHK_LINE, COLALL(i)).Select MsgBox ("セルに管轄名または店舗名を記入してください") Exit Sub End If If LenB(DB_WS.Cells(CHK_LINE, COLALL(i)).Value) > 31 Then DB_WS.Cells(CHK_LINE, COLALL(i)).Select MsgBox ("管轄名または店舗名は半角31文字までです") Exit Sub End If For j# = 1 To Len(DB_WS.Cells(CHK_LINE, COLALL(i)).Value) For k# = 1 To 8 If Mid(DB_WS.Cells(CHK_LINE, COLALL(i)).Value, j, 1) = ERRSTR(k) Then DB_WS.Cells(CHK_LINE, COLALL(i)).Select MsgBox ("「 : \ / ? * [ ] . 」は管轄名または店舗名として利用できません") Exit Sub End If Next k Next j Next i Next CHK_LINE Application.ScreenUpdating = False '時刻を拾って結果格納フォルダを作成する。 FILE_PATH = ThisWorkbook.Path FILE_FLD = Format(Now(), "YYYYMMDDhhmmss") FULL_PATH = FILE_PATH & "\" & FILE_FLD MkDir FULL_PATH For CHK_LINE = 2 To DB_WS.Cells(65535, COLALL(1)).End(xlUp).Row On Error Resume Next 'ブックオープン処理 Workbooks.Open FULL_PATH & "\" & DB_WS.Cells(CHK_LINE, COLALL(1)).Value & ".xls" If Err.Number <> 0 Then 'ブック未作成の時は作成する Err.Number = 0 On Error GoTo ERREND Workbooks.Add TP_WS.Copy Before:=Workbooks(2).Worksheets(1) Workbooks(2).Worksheets(1).Name = DB_WS.Cells(CHK_LINE, COLALL(2)).Value For i = Workbooks(2).Worksheets.Count To 2 Step -1 Application.DisplayAlerts = False Workbooks(2).Worksheets(i).Delete Application.DisplayAlerts = True Next i Workbooks(2).SaveAs (FULL_PATH & "\" & DB_WS.Cells(CHK_LINE, COLALL(1)).Value & ".xls") End If Dim SHTEXISTFLG As Boolean SHTEXISTFLG = False 'データコピー処理 For i = 1 To Workbooks(2).Worksheets.Count 'シート未作成の時は作成する If Workbooks(2).Worksheets(i).Name = CStr(DB_WS.Cells(CHK_LINE, COLALL(2)).Value) Then SHTEXISTFLG = True Exit For End If Next i If SHTEXISTFLG = False Then TP_WS.Copy After:=Workbooks(2).Worksheets(Workbooks(2).Worksheets.Count) Workbooks(2).Worksheets(Workbooks(2).Worksheets.Count).Name = DB_WS.Cells(CHK_LINE, COLALL(2)).Value End If If DB_WS.Cells(CHK_LINE, COLALL(3)).Value = "新規" Then '新規の件数か、解約の件数かを判断する i = ROWALL(1) Else i = ROWALL(2) End If For j = COLALL(4) To COLALL(5) Workbooks(2).Worksheets(CStr(DB_WS.Cells(CHK_LINE, COLALL(2)).Value)).Cells(i, j).Value = _ DB_WS.Cells(CHK_LINE, j).Value Next j Workbooks(2).Close (True) Next CHK_LINE MsgBox ("データ整理が正常に完了しました") ERREND: If Err.Number <> Empty Then MsgBox Error(Err.Number) End If Application.ScreenUpdating = True End Sub 'ここまで-------------------------------------------------------------------------------------- なお、この答えを書き込もうとしたら 「機種依存文字が・・・」という表示が出てきて、この答えのどこかが変わってしまったみたいです。 恐らくどこかの漢字だと思いますし、その漢字を使った箇所全てが入れ替わっているはずなので問題ないとは思いますが。。。 問題ありましたら、また連絡ください。

  • ykym
  • ベストアンサー率22% (8/35)
回答No.1

ループ処理をする命令"For"を使います。 以下のコードは概要ですが Dim ArrCol As Variant Dim StrShop As String ArrCol = Array("●●店", "▲▲店", "◆◆店") For Each StrShop In ArrCol '----------------- 'この位置に繰り返す処理を記述 '----------------- Next まず、繰り返しをするためのすべての要素の配列を作成します。 その次の"For Each"命令でそのすべてを順に処理します。 上のコードの場合"For Each" 命令から "Next"命令の間は"StrShop" 変数で店名を参照できますので検索するための命令に使用してください。 処理する店を増やす場合には"Array"文の括弧の中に新しい店名をカンマ で区切って追加してください。

miechin
質問者

お礼

ご回答ありがとうございます。 店名が40ぐらいあったりするのですが、 ArrCol = Array("●●店", "▲▲店", "◆◆店")へ全部の店名を入れると長くなるのですが、sheet1の(A1:A40)空白になったら終わり。というようなのはできないでしょうか? 初心者でして混乱しています。申し訳ございませんが再度ご回答いただけないでしょうか。よろしくお願いいたします。

関連するQ&A

  • エクセルのマクロについて(オートフィルタ&シート分け等)

    管轄 担当者 店名 販売数 東京 佐藤  ●●店 100 東京 佐藤  ××店 120 東京 佐藤  △●店  50 大阪 山本  ▲△店  83 大阪 山本  △▲店  15 大阪 山本  ●△店  30 福岡 川田  ◎×店  68 福岡 川田  □×店  24 このようなデータ(約300行)がたくさんあります。 オートフィルタで各担当者(約20名)に分け、各担当者のシートを自動作成し、担当者の列を削除したいのですが、同じファイルにシートを追加する方法でよろしいのですが・・・ マクロ初心者でして、わからないことが多いです。 どなたかご存知の方お教え下さい。どうぞよろしくお願いします。

  • エクセル マクロでシート名変更

    Excelで、作成してあるフォーマットに新しく数値をコピーして完成した表を別のブックに移動して保存しようと考えています。その際、シートのA1セルの値を自動的にワークシート名に持ってきたいのですが、やり方が分からず困っています。 シート名のところ以外は、なんとなくマクロの記録を使ってできそうなのですが、A1セルの値を自動的にシート名にすることができずに引っかかっています。 いい方法があれば教えてください。 よろしくお願いいたします。

  • EXCEL VBA オートフィルタの値コピー

    ほぼ初心者ですのでよろしくお願いします。 Sheet2にデータがありそのデータをオートフィルタで日付から抽出してSheet3にコピーして、その後Sheet1の表に該当項目をコピーする際についてですが、オートフィルタ後、1日当たり行は10~15行あります、そのうちG列にはデータが通常2つのセルに値があるだけでほかの行は空欄です。(日によってどの行になるかはわかりません)この2つのセルの値をそれぞれSheet1のM10とM11コピーしたいのです、 ちなみにセル番地は下記の方法で取得できましたが、値の取得ができません。 Range("D1").Value = Worksheets("sheet1").Range("A1").End(xlDown).Row Range("D2").Value = Worksheets("sheet1").Range("A65536").End(xlUp).Row Sub データコピー() Range("AB17") = Format(Sheet3.Range("A3").Value, "yy") Range("AE17") = Format(Sheet3.Range("A3").Value, "mm") Range("AH17") = Format(Sheet3.Range("A3").Value, "dd") Range("AK17") = Format(Sheet3.Range("A3").Value, "aaa") Range("D22") = Sheet4.Range("D3").Value Range("D25") = Sheet4.Range("E3").Value Range("H22") = Sheet4.Range("F3").Value Range("D22") = Sheet4.Range("G3").Value Range("L22") = Sheet4.Range("K3").Value Range("Q22") = Sheet4.Range("L3").Value Range("U22") = Sheet4.Range("M3").Value .   .   . End Sub

  • vba ブック間でシート名のコピーをするには

    始めまして、よろしくお願いします。 excel vba 初心者のものです。 2つのブックがあり同時に開いている状態です。1つのブックはデータがあります。 もう1つは空のブックです。 データのあるブックのシートには、 シート1のシート名は「8月1日」 シート2のシート名は「8月2日」 シート3のシート名は「8月4日」 シート4のシート名は「8月5日」 シート5のシート名は「Sheet1」 やりたいこと データ、シート名があるブックから、 空ブックのシートにシート名をコピーしてきてセルに貼り付けたいです。 シートに名前を付けてるシート数は不規則なので「Sheet1」まで来たら終了したいです。 どうぞご教授の程よろしくお願い申し上げます。

  • エクセルのシート名の表示

    エクセルシートのセルに数式でシート名を自動表示することって出来ますか? シート名を変更すると、そのセルに表示されているシート名も自動的に変わるような・・・。よろしくお願いします。

  • Excelのシート間のコピー&貼付け

    皆様にお聞きしたいのですが。。m(_ _)m あるシートで作成したデータ(罫線等は入れてません。セルに入力したデータのみです)を、一番上の項目名のみまず最初に別シートにコピーしました。 そして元データでフィルタで抽出した間違いがあったデータのみ、複数の行番号をドラッグで選択して別シートにコピー&貼付けをしていたら、なぜか元のシートと列の数が合わなくなりました; 列の数は40前後と多いのですが・・・ 一番上の項目名と途中か合わなくなっていました(T-T) 普通に行を選択してコピー、そして別シートへ貼付けしていただけなのですが。。 こうゆうことってあるのでしょうか??? どなたか、どうかご教授ください。宜しくお願い致します。。 補足 ちなみに、ちゃんとコピー先のシートのA2(項目行の先頭の下の行)にコピーしたのですが・・。

  • EXCEL VBA オートフィルタの値コピー2

    たびたびすいませんよろしくお願いします。 EXCEL VBA オートフィルタの値コピーの追加質問です http://okwave.jp/qa4803815.html?ans_count_asc=20 オートフィルタ後、1日当たり行は10~15行あります、そのうちH列からM列まで、ある1行にデータがありますそのデータをH列から順番にSheet1のM20とM28までコピーしたいのです、ただ日によってその列は空欄の時やM列だけの時もありますもあります。さらにN列からP列まで同じようにデータがある時(H列からM列と行が違うときがあり)、上にある行からSheet1のM20とM28に上詰めでコピーしたいのです。 もっと簡単にいいますとH列からP列まである値を上の行からさらにH列から順番に上詰めでSheet1のM20とM28にコピーしたいのです。 なにとぞよろしくお願いします。 Sub データコピー() Range("AB17") = Format(Sheet3.Range("A3").Value, "yy") Range("AE17") = Format(Sheet3.Range("A3").Value, "mm") Range("AH17") = Format(Sheet3.Range("A3").Value, "dd") Range("AK17") = Format(Sheet3.Range("A3").Value, "aaa") Range("D22") = Sheet4.Range("D3").Value Range("D25") = Sheet4.Range("E3").Value Range("H22") = Sheet4.Range("F3").Value Range("D22") = Sheet4.Range("G3").Value Range("L22") = Sheet4.Range("K3").Value Range("Q22") = Sheet4.Range("L3").Value Range("U22") = Sheet4.Range("M3").Value .   .   . End Sub

  • シート名だけを変えてコピーしたい

    Excel 2003を使用しています。 添付画像は、一時的に数式を表示するようにしています(どのセルに今どのような計算式が入っているか)。 Sheet6 の セルB2からセルF2迄、データ1の値を参照する計算式が入っていますが、 これを、3行目から6行目まで、シート名の違う、計算式をコピーしたいのですが、 どのようにすれば良いでしょうか? 縦にコピーした後、参照式のシート名と行番号を変更しています。 例えば、セルB2をセルB3にコピーしたら、セルB3の参照式は データ1!A2となっています。 これをデータ2!A1としたいのです。 実際に計算式の入っているシートは、もっと沢山の参照式が入っているので元の計算式の方法を 変更は難しいです。

  • Excel VBA:ひとつ前に開いていたシート名の取得

    Sheet1,2,3があり、全て同じ種類の「表」が書かれているとします。 例えばクラス名簿だとして、 Sheet1には出席番号1~10の生徒のデータ、 Sheet2には出席番号11~20の生徒のデータ、のように。 各シートのうち、違うのはデータの中身であって、 [出席番号][生徒氏名]などの項目は同じです。 この時、 Sheet1で項目名を変更した時、Sheet2、Sheet3の項目名も同時に変更させたいです。 Sheet1の[出席番号]を[No.]に変更したら、Sheet2,3の[出席番号]も自動的に[No.]に変更させたいです。 また、変更可能なのはSheet1だけでなく、Sheet2の項目を変更した時もSheet1,3の項目を自動的に変更したいです。 常にSheet1の項目を参照するのであれば、 Private Sub Workbook_SheetActivate(ByVal ActSheet As Object) SName = "Sheet1" Sheets(SName).Range("A4:G4").Copy 'Sheet1の項目をコピー Sheets(ActSheet.Name).Range("A4").Select ActiveSheet.Paste '現在アクティブなシートにSheet1の項目をコピー End Sub で可能でした(諸事情によりセル内に「=Sheet1!A4」等と書きたくないです)。 このコードで、 参考するシート名を入れる変数SNameに「1つ前に開いていたシート名」を入れることができれば可能だと思うのですが、 そのようなデータを取得することはできるでしょうか? よろしくお願いします。

  • エクセル2003 マクロ シート名

    エクセル2003です。 1つのブックにシートが10シート有ります。 R2のセルに日付を入れると それぞれのシート名が日付 (例)"11月25日"になるようなマクロを作りたいのですが、 教えてください。 又は逆にシート名に"11月25日"とすると R2セルが"11月25日"となるマクロを教えてください。 日付はシート毎に違います。 すみませんがよろしくおねがいします。

専門家に質問してみよう