• ベストアンサー

エクセル マクロ

kagakusukiの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 考えられる様々なパターンにおいて、エラー等を回避する様にした処、VBAの構文が非常に長いものになってしまいましたが、以下の様なマクロは如何でしょうか? Sub QNo8960058_エクセル_マクロ() Dim myBox As Variant Dim c, myRange As Range Dim DefSheet, DefCell, mySheet, myArea(), NotName(9), myNow, myFolder As String Dim i, n, LastRow As Long Dim myOK, RewriteON As Boolean Dim myBook As Workbook DefSheet = "Sheet1" DefCell = "A3" NotName(1) = "\" NotName(2) = "/" NotName(3) = "?" NotName(4) = ":" NotName(5) = "*" NotName(6) = """" NotName(7) = ">" NotName(8) = "<" NotName(9) = "|" label1: On Error Resume Next Set myBox = Application.InputBox( _ Prompt:="エリアの名称が入力されている最初のセルをマウス等を使って選択して下さい。" _ , Title:="データが始まっているセルの指定", Default:=DefSheet & "!" & DefCell _ , Type:=8) If IsError(myBox.Row) Then myBox = MsgBox("セルが選択されていません" & Chr(13) & "セルの選択をやり直しますか?" _ & Chr(13) & Chr(13) & "[再試行]:セルの選択のやり直し" & Chr(13) & "[キャンセル]:マクロの終了" _ , vbRetryCancel + vbExclamation + DefaultButton2, "無効な選択") If myBox = vbRetry Then GoTo label1 Exit Sub End If On Error GoTo 0 If myBox.Parent.Cells(Rows.Count, myBox.Column).End(xlUp).Row < myBox.Row Then myBox = MsgBox("選択されたセルから下の範囲にはデータがありません" & Chr(13) & _ "セルの選択をやり直しますか?" & Chr(13) & Chr(13) & _ "[はい]:セルの選択のやり直し" & Chr(13) & "[いいえ]:マクロの終了" _ , vbYesNo + vbExclamation, "データ無し") If myBox = vbYes Then GoTo label1 Exit Sub End If LastRow = myBox.Parent.Cells(Rows.Count, myBox.Column).End(xlUp).Row Set myRange = myBox _ .Resize(LastRow - myBox.Row + 1, 1) mySheet = myRange.Parent.Name Sheets(mySheet).Select myRange.Select myBox = MsgBox("この範囲に入力されているエリア名を基準として、" & Chr(13) & _ "データをエリア名ごとに分別したファイルを作成します。" & Chr(13) & Chr(13) & _ mySheet & "!" & myRange.Address(False, False) & Chr(13) & Chr(13) & _ "宜しいですか?" & Chr(13) & Chr(13) & "[OK]:処理を実行します" & Chr(13) & _ "[キャンセル]:処理の実行を中止し、マクロを終了します", vbOKCancel + vbQuestion, "確認") If myBox = vbCancel Then MsgBox "マクロを終了します", vbInformation, "処理の中止" Exit Sub End If ReDim Preserve myArea(myRange.Rows.Count - 1) n = 0 NotName(0) = "" For Each c In myRange If Trim(c.Value) <> "" Then If Application.WorksheetFunction.CountIf(Range(myRange.Resize(1, 1), c), c.Value) = 1 Then myOK = True For i = 1 To 9 If InStr(StrConv(c.Value & "", vbNarrow), NotName(i)) > 0 Then myOK = False Next i If myOK Then myArea(n) = c.Value n = n + 1 Else NotName(0) = NotName(0) & Chr(13) & mySheet & "!" & c.Address(False, False) _ & " = """ & c.Value & """" End If End If End If Next c If NotName(0) <> "" Then myBox = MsgBox("以下のセルに入力されている値はファイル名として使用出来ない文字が" & _ "含まれているか、或いは空欄であるため、ファイル名として使用出来ません。" & _ Chr(13) & NotName(0) & Chr(13) & Chr(13) & _ "これらのセルが存在している行のデータは無視して、その他の行のデータのみに対して処理を行いますか?" _ & Chr(13) & Chr(13) & "[OK]:ファイル名として使用出来るものに対してのみ処理を行います" & Chr(13) & _ "[キャンセル]:マクロを終了します", vbOKCancel + vbExclamation + vbDefaultButton2, "無効なデータ") If myBox = vbCancel Then Exit Sub End If If n = 0 Then MsgBox "有効なデータがありません。" & Chr(13) & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If n = n - 1 ReDim Preserve myArea(n) Set myBook = Workbooks.Add label2: MsgBox "下の[OK]ボタンを押すと現れる" & Chr(13) & "「名前を付けて保存」ダイアログボックスにおいて" _ & Chr(13) & "新規に作成するExcelbookの保存先のフォルダーを選択してから" & Chr(13) & _ "[保存]ボタンを押して下さい。", vbInformation, "操作方法の説明" label3: myNow = "" myFolder = Application.GetSaveAsFilename(InitialFileName:=myArea(0)) If myFolder = "False" Then myBox = MsgBox("保存先を指定しなければ新しいBookを保存する事が出来ません。" & Chr(13) & _ "保存先を指定し直しますか?" & Chr(13) & Chr(13) & "[再試行]:セルの選択のやり直し" & Chr(13) _ & "[キャンセル]:マクロの終了", vbRetryCancel + vbExclamation, "保存先の再選択") If myBox = vbRetry Then GoTo label2 Else Exit Sub End If End If myFolder = Left(myFolder, InStrRev(myFolder, "\")) myOK = True For i = 0 To n If Dir(myFolder & myArea(i) & ".xlsx") <> "" Then myOK = False Next i ※まだ途中なのですが、このサイトの回答欄の文字数制限である4000文字を超えてしまうため、残りは又後で投稿致します。

関連するQ&A

  • Excelマクロのコンボボックスに関して

    マクロを初めて扱います。 どなたか詳しい方、ご教授ください。 Excelのシート上にActiveXのコンボボックスを作成しました。 このコンボボックスに同じブックの別シートのA列のX行目からY行目までを格納したいと考えております。 どうかコードの書き方をお教えいただけませんでしょうか?

  • エクセルのマクロで悩んでます

    はじめて投稿いたします。 現在、エクセル2000でマクロを組んでいるのですが、何日も悩んでそこから動けないので質問させていただきます。 やりたいことは、 (1)検索フォームの入力テキストに記載した数値を読んで検索ボタンを押すと、 (2)データブック.xls内の完全に一致した数値のセルの行をアクティブにして (3)その行のA列からO列の値をコピーして (4)入力ブック.xlsの入力シートのB4:B18に数値だけ貼り付け したいと考えています。 検索フォームは入力ブック.xls内で作成しています。 今のところ、(3)でA列の値を読んで、(4)でB4セルに貼りつけということはできているのですが、複数になるとできていません。 根気よく、同じプログラムを書くのが良いのでしょうか? かなり面倒なので、もっと簡単にかける方法があれば教えてください。

  • こんな関数ありますでしょうか?

    こんな関数ありますでしょうか? 日頃お世話になっております。 Excel2000で、指定した検索条件に一致する隣のセルの 個数を取り出したいのですが、出来ますでしょうか? 「例」      A列     B列 1    みかん   東北 2   りんご    東北 3    りんご    関東 4   いちご    関西 5   りんご    九州 6   みかん    九州 7   いちご    四国 8   みかん    関東 上記データーより、A列の「みかん」を検索条件として B列より「東北」=1 「九州」=1 「関東」=1 というデーターを、取り出したいのですが。。。 ご教示お願い致します。 m(__)m

  • エクセルマクロで空欄と空欄の間のデータを取得する

    添付画像のようなデータが並んだエクセルシートがあります。(ブックA) ブックAsheet1のA列に数値が入っている行のB列~D列のデータを別のブックBから取得したいのです。 ブックBにsheet1~sheet20まであります。 ブックAsheet1のA列に数値が入っている行のB列~D列のデータを1セットとして、ブックBのsheet1のB1にコピーする。 次のグループをブックBのsheet2のB1にコピーする、 また次のグループをブックBのsheet3のB1にコピーする。 ブックBには書式設定してあるので、値のみコピーします。 ブックAのB列~D列の数値の配置はそのままでコピーします。 この作業をブックBからマクロで行う方法を教えて下さい。 宜しくお願いします。

  • エクセルのマクロについての質問お願いいたします。

    エクセルのマクロについての質問お願いいたします。 コピーについてお願いいたします。 A列に文字(文章)が1行目から150行ぐらいや2000行ぐらいなど文字があります。この行の間には空白の行もあります。 Range("A1:A2000").Copyこちらですと最終行の以下の空白行もコピーするので困っております。 例えば、文字が1000行までで終わっていたら、1000行までコピーする方法をどうぞご教授ください。

  • コピーするExcelマクロを作りたいです(2)

    「コピー元」ブックから「コピー先」ブックにコピー&ペーストを 行うマクロを作りたいのですが、列の計算が複雑で困っています。 Excelブックのキャプチャ画像を加えて再投稿します。 画像ではシートになっていますが、画面左のシートのような表から 右のシートの当てはまるセルにデータを写すようにお考えください。 「コピー元」ブックは月に一度ダウンロードするデータで、ピボット テーブルです。一月ごとに、前月の列が各営業所ごとに増えていき ます。行には、商品ごとの売上げが入力されています。 また、各営業所ごとに、年度合計列があります。(営業所の数は10 前後、商品の行は50以上はあります。) 「コピー先」ブックは、あらかじめ年度末までの行列セル、合計列が 用意されていて、「コピー元」ブックからデータを移動してくるのみ でレポートとして毎月提出する体裁です。 単純にコピーするだけならばよいのですが、毎月各営業所一列ずつ 増えていくというのが式にして表せません・・・また、できる限り 数値の変更を最低限にして、毎年度利用できるマクロにするという 希望もあります。 ご面倒かと思いますが、お力を貸してください。

  • エクセルのマクロの繰り返し

    よろしくお願いします。 「A1からA5までの数値を数字の大きい順に並び替えして、 そのA1からA5のデーターをC1からC5にコピーする。 次にB列に1列挿入する。」 ここまではエクセルのマクロ機能で出来ましたが それを100回くり返すコードというか、 コードの書き方、仕方がわかりません。 このばあいどのようなコードでしょうか

  • エクセルで変化する行数に対応してコピーするマクロ

    エクセルワークブックAを検索して見つかった範囲をワークブックBのシートとセルを指定して転記するマクロ。 このようなマクロコードを教えてください。 ブックAのシート1に以下のような配置で文字と数値が入っています。 A列        B列      C列      D列      E列 あいう えお            10       aa      かかか     123          20       ss      ききき     456                        くくく      8910                        けけけ     234                        こここ     5678                        さささ     9123 -------------スペース-------------------------------- かきく けこ             10      aa      かかか     123           20      ss      ききき      456           30      dd      くくく      8910                        けけけ      234                        こここ      5678 -------------スペース-------------------------------- さしす せそ             10      aa      かかか      123           20      ss      ききき      456                        くくく       8910                        けけけ       234 -------------スペース-------------------------------- 上記の様にスペースとスペースの間を1グループとしてコピーしたいのですが、行数が変化します。 また列によって入力されてる行数も違います。 ブックBから操作するマクロでブックAのシート1の”あいう”という文字列を含んだセルを検索して、 次のスペースまでの1グループをコピーしてブックBのシート1のA1に貼り付ける。 (あいう えお~9123まで) 続いてブックAのシート1の”かきく”という文字列を含んだセルを検索して、 次のスペースまでの1グループをコピーしてブックBのシート2のA1に貼り付ける。 (かきく けこ~5678まで) ブックAのシート1の”さしす”という文字列を含んだセルを検索して、 次のスペースまでの1グループをコピーしてブックBのシート3のA1に貼り付ける。 (さしす せそ~234まで) *ブックAのファイル名は固定ですが、ブックBは毎回違います。 マクロの実行はブックBから行います。 この様な条件でのマクロを教えてください。 行数変化に対応している部分に但し書きを付けて頂けると応用が利きますので有難いです。

  • エクセル:マクロの起動条件

    お世話になります。 以下の条件でのマクロを起動する方法、及びそのマクロを教えてください。 《条件》 ブックを開いた時、あるシートのC列でデータが入っている最下行の行番号とA列のデータが入って最下行の行番号の差が100以下だった場合、マクロを実行する。 (なおC列の行番号の方が必ず大きいです) ちなみに実行したいマクロは1~6の手順です。 1.ブックを開いたとき 2.「入力用」という名前のシートのC列でデータが入っている最下行の行番号とA列のデータが入っている最下行の行番号の差が100以下だった場合 3.「入力用」というシートにかかっているシートの保護をはずし 4.データが入っているC列の最下行のA~Z列を選択して、50行分 下にコピーする。  (例えば、C列の最下行が350行の場合、A350~Z350まで を選択したあと400行まで下にコピーする。) 5.再度シートの保護をかけ 6.A列でデータが入っている最下行の1つ下のセルを選択する ちなみに、2の条件に当てはまらないときはマクロを実行しません。 またC列の最下行よりA列の最下行が大きい数字になることはないはずですが、もし同じかA列の方が大きい場合、「エラー:C列よりA列が大きくなっています」と画面に表示させたい。 なお、行番号の差:100、選択するA~Z行、50行分下にコピー は変わる可能性があるので、修正する場合どの部分を修正すればよいかも教えてください。 よろしくお願いします。

  • 至急お願いします。エクセルのマクロに関してです。

    かなり至急です><エクセル2010のマクロの質問です。 2つ質問があります。 1つ目です。 以下の一連の作業を1つのマクロで行いたいのですが、どうしたらいいでしょうか? 現在は、シート1にデータがあります。 (1)選択した3列を、B~D列に移動する (2)B列に含まれるセルのうち、0(空白)でないセル数分だけシートを追加する。 (たとえば、シート1のB14~B18に数字がはいっていたら、シートを5枚追加するという感じです。) (3)B列に含まれるセルのうち、0(空白)でないセル数分に対し、2行ずつ各シートの3・4行目にコピーする。 (たとえば、シート1のB14~B18に数字がはいっていたら、シート2の3・4行にシート1の14・15行のコピーを貼り付け、シート3の3・4行にシート1の15・16行のコピーを貼り付け、シート4の3・4行にシート1の16・17行のコピーの貼り付ける・・・という感じです。) 現在は (1)Sub () Selection.Cut ActiveCell.Columns("A:C").EntireColumn.Select Selection.Cut Columns("B:B").EntireColumn.Select Selection.Insert Shift:=xlToRight End Sub (2) Sub Macro() Dim n As Long For n = 14 To 18 ' Sheets.Add Next End Sub (3) Sub Macro() Dim n As Long For n = 14 To 18 ' Sheets("Sheet1").Rows(n & ":" & n + 1).Copy _ Sheets("Sheet" & n - 252).Range("A3") Next End Sub と別々のマクロに分けてます。 また(2)(3)でみられる For n = 14 To 18 ' の部分の数字は手動でいれてますが、かなり時間をくってしまうので・・・。 2つ目です。 複数ブックに同じ動作をするエクセルのマクロが知りたいです。 現在100ほどブック(Book1~100)を開いていて、100のブックすべてのSheet1のA1のセルに「1」と入れたいのですが、 そのようなマクロはどうくんだらよろしいでしょうか。 ちなみにExcel2007です。 困っているので、お願いします。