• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:対話型で入力された情報にて処理を行うマクロ)

対話型で処理するマクロ

jcctairaの回答

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

gx9wxさん こんにちは。 下記は要望に応えたプログラムです。 ただ、勝手に気になった所(無駄等)を修正しました。 1. With ActiveSheet   全く意味がない(使用していない)ので省きました。   ※セルを指定する時、シートオブジェクトを省略すると「ActiveSheet」が使われます 2.InStr(1, n, "-", 1) InStrは開始位置や比較方法を省略できます。  → InStr(n, "-")  ※省略した方がプログラムミス(入力ミス)も減るかと思います 3.Case InStr(1, n, "-", 1) = 9 '9字目が- "-"が9文字目より前にあると動作が変わってしまうので直接9文字目で判断した方が良いと思います  → Mid(n, 9, 1) = "-"                    4.Selection  マクロ記録ではSelectionが自動的に記録されますが無駄です  → Columns("B:B").Insert Shift:=xlToRight 5.その他  ・今回対象列等を入力していますが、入力チェックや入力確認をするようにした方が良いと思います   例えばフォームを使ったり  ・変数宣言(DIM)はした方が良いと思います。   入力ミスをすると思わぬ結果になりますので…。 勝手に余計なことを書きましたが、なるべく無駄のないプログラムを作成した方が、後々修正がしやすく わかりやすいかと思います。  Sub ハイフン挿入()  対象値列 = InputBox("対象値のある列を入力してください")  列挿入 = MsgBox("列挿入しそこに転記しますか?", vbYesNo)  If 列挿入 = vbYes Then   転記列 = InputBox("挿入したい列を入力してください。例:H列とI列の間→H")  Else   転記列 = InputBox("転記する列を入力してください")  End If  If 列挿入 = vbYes Then   Columns(転記列).Insert Shift:=xlToRight  End If  行 = 1  Do   n = Cells(行, 1).Value   If n = "" Then Exit Do   If Len(n) = 14 Then    Select Case True     Case Left(n, 2) = "9X" And InStr(n, "-") = 0     '左2字=9X & -が無      myStr = Left(n, 3) & "-" & Mid(n, 4)          '3-11で編集     Case Mid(n, 9, 1) = "-"                   '9字目が-      myStr = Left(n, 3) & "-" & Mid(n, 4, 11)       '3-5-5で編集     Case Left(n, 1) = "9" And InStr(n, "-") = 0       '左1字=9 & -が無      myStr = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & _          Mid(n, 11, 2) & "-" & Mid(n, 13, 2)        '5-5-2-2で編集     Case InStr(n, "-") = 0                   '-が無      myStr = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & _          Mid(n, 9, 2) & "-" & Mid(n, 11, 2) _          & "-" & Mid(n, 13, 2)                '3-5-2-2で編集     Case Else                            'いずれにも属さない14文字      myStr = n                           '編集対象の値を使用する(未編集)    End Select   Else                                 '編集対象の値が14文字でない    myStr = n                             '編集対象の値を使用する(未編集)   End If   Cells(行, 転記列) = myStr   行 = 行 + 1  Loop End

gx9wx
質問者

お礼

>1. With ActiveSheet 私の記述の入ったBOOK1を開いて マクロが入っていないBOOK2,3,4,5,6を開いておき BOOK2を選択して、BOOK1に入っているマクロを使用、 BOOK3を選択して、BOOK1に入っているマクロを使用 と行う場合に必要なのかと思いました。 >2.InStr(1, n, "-", 1) >InStrは開始位置や比較方法を省略できます。 ありがとうございます。初めて知りました。 >3.Case InStr(1, n, "-", 1) = 9 '9字目が- >"-"が9文字目より前にあると動作が変わってしまうので >直接9文字目で判断した方が良いと思います 言われてみると確かにです。ありがとうございます。 >4.Selection > マクロ記録ではSelectionが自動的に記録されますが無駄です > → Columns("B:B").Insert Shift:=xlToRight マクロの記録で出来上がった記述であまり行数が多い場合は 調べてなんとか少ない行数にと行動するのですが 2行くらいならいいかなとサボっていました。 申し訳ありません。 >・変数宣言(DIM)はした方が良いと思います。 これがまだ良くわからなくて困ってます。 今回教えていただいた中の 転記列 = InputBox("挿入したい列を入力してください。例:H列とI列の間→H") Else 転記列 = InputBox("転記する列を入力してください") Cells(行, 転記列) = myStr の部分、InputBoxに例えばHと入力すると Cells(行, 転記列) = myStr ↓↓ Cells(行, H) = myStr (この解釈が間違っているのでしょうか?) なぜCells(行, H)でいいのでしょうか? ここはHなら8でないといけないのでは? でも正しく動くので余計に? です。 >勝手に余計なことを書きましたが 全然、勝手ではないです。 いろいろ教えていただきまして 大変ありがとうございました。 とりあえず、InputBoxへの入力さえ間違わなければ 思っていたとうりになりました。 どうもありがとうございました。

gx9wx
質問者

補足

>・今回対象列等を入力していますが、入力チェックや入力確認を >するようにした方が良いと思います >例えばフォームを使ったり >・変数宣言(DIM)はした方が良いと思います。 >入力ミスをすると思わぬ結果になりますので…。 使ってみて痛感しました。 A~IV以外は入力できないするようにした方がいいと思いました。 ここ↓↓もです。 >対象値列 = InputBox("対象値のある列を入力してください") ここで入れた値より前の値を >転記列 = InputBox >("挿入したい列を入力してください。例:H列とI列の間→H") ここで入力すると成り立ちませんでした。 最初にDと入力し 次に挿入希望列でBと入力すると 対象値のD列はE列にずれるからです。 ここにも入力制限が必要でした。 最初に入れた値よりも前の値は入力禁止にしなければ駄目でした。 でも方法は....分かりません。 どうもありがとうございました。

関連するQ&A

  • 対話型で入力された情報にて処理を行うマクロ(続)

    ここで教えていただいた記述をバージョンアップさせたいです。 仕様と記述 1.インプットBOX-1   「対象値のある列を入力してください」   入力例:G ↓↓ 2.メッセージボックス   「列挿入しそこに転記しますか?」   YES/NO 選択 ↓↓ 3.YESの場合   インプットBOX-2   「挿入したい列を入力してください。例:H列とI列の間→H」   入力例:H   NOの場合   インプットBOX-3   「転記する列を入力してください」   入力例:J インプットBOX-1に入力された値の列を対象列として Select Caseの条件で編集して インプットBOX-2又は3に入力された値の列に転記します。 対象列にデータがあるまで処理を繰り返します。 バージョンアップさせたい内容 (1) インプットBOX-1,2,3はエクセルの列の入力なので A~IV以外の入力はエラーとして 「入力値が違います。A~IV のいずれかを入力してください。再入力しますか?」 でOKをクリックすると再入力可能に (2) インプットBOX-2 インプットBOX-1で入力した値より前の値はエラーとする 「対象列がずれます。●●以外を入力してください。再入力しますか?」 OKをクリックで再入力可能に。 例:インプットBOX-1にCと入力した場合A,B,Cはエラー   となる。●●の所にその値を表示する。 (3) インプットBOX-3 インプットBOX-1で入力した値と同じ値の場合はエラーとする。 「対象列の元の値が削除されたてしまいます。●●以外を入力してください。再入力しますか?」 OKをクリックで再入力可能に。 例:インプットBOX-1にCと入力した場合Cはエラーとなる。   ●●の所にその値を表示する。 (1)(2)(3)の記述を教えてください。お願いします。 以下が現在の記述です。 ↓↓↓ Sub ハイフン挿入02() '2010年11月24日 対象値列 = InputBox("対象値のある列を入力してください") 列挿入 = MsgBox("列挿入しそこに転記しますか?", vbYesNo) If 列挿入 = vbYes Then 転記列 = InputBox("挿入したい列を入力してください。例:H列とI列の間→H") Else 転記列 = InputBox("転記する列を入力してください") End If If 列挿入 = vbYes Then Columns(転記列).Insert Shift:=xlToRight End If 'データは2行目からの事 行 = 2 Do '対象値列にデータがあるまで繰り返す n = Cells(行, 1).Value If n = "" Then Exit Do '対象列は14文字である事 If Len(n) = 14 Then Select Case True '左2字=9X & -が無 Case Left(n, 2) = "9X" And InStr(n, "-") = 0 '3-11で編集 myStr = Left(n, 3) & "-" & Mid(n, 4) '9字目が- Case Mid(n, 9, 1) = "-" '3-5-5で編集 myStr = Left(n, 3) & "-" & Mid(n, 4, 11) '左1字=9 & -が無 Case Left(n, 1) = "9" And InStr(n, "-") = 0 '5-5-2-2で編集 myStr = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) '-が無 Case InStr(n, "-") = 0 '3-5-2-2で編集 myStr = Left(n, 3) & "-" & Mid(n, 4, 5) & "-" & Mid(n, 9, 2) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 2) 'いずれにも属さない14文字 Case Else '編集対象の値を使用する(未編集) myStr = n End Select '編集対象の値が14文字でない Else '編集対象の値を使用する(未編集) myStr = n End If Cells(行, 転記列) = myStr 行 = 行 + 1 Loop End Sub

  • マクロでLen関数の使い方がわかりません。

    マクロでLen関数の使い方がわかりません。 基幹システムのデーターベースをエクセル出力する機能があります。 その吐き出したエクセルファイルを使って 印刷したり、別のシステムにインポートしています。 このデーターの行数は吐き出すたび違います。 吐き出したエクセルのD列にあるデータですが ここは必ず半角数字7桁固定長と決まっています。 7桁に満たないデータは0で埋めて7桁になっています。 基幹システム上でも7桁で表示されています。 例↓ 0000002 0002222 0000000 ですがエクセルに吐き出されると桁数が変わってしまいます。 (なぜか0は空白にならず0と表示されています) 書式設定は[標準]でエラーマークが出ていて (数値が文字列として保存されています)となっています。 例↓ 2 2222 0 印刷時は後者、インポート時には前者である必要があるので 以下のようにE列は残したままF列に7桁表示を加えたいです。      E   → F -------------------------- 1     2  → 0000002 2  1234567 → 1234567 3    333 → 0000333  4   22 → 0000022 5   4444 → 0004444 6   0 → 0000000 以下のマクロを作成しましたが動作しません。 Select Caseでという考え方がまずいのでしょうか? (それ以前にLen関数の使い方もわかっていません。) どうかよろしくお願いします。 Sub 七文字化() 行 = 2 Do If Cells(行, 2).Value = "" Then Exit Do n=Cells(行,2) Select Case True '6文字 Case Len(n) = 6 '先頭に0を追加 myStr = "0" & n '5文字 Case Len(n) = 5 '先頭に0を追加 myStr = "00" & n '4文字 Case Len(n) = 4 '先頭に0を追加 myStr = "000" & n '3文字 Case Len(n) = 3 '先頭に0を追加 myStr = "0000" & n '2文字 Case Len(n) = 2 '先頭に0を追加 myStr = "00000" & n '1文字 Case Len(n) = 1 '先頭に0を追加 myStr = "000000" & n '7文字ある時 Case Else myStr = n Cells(行, 3).Value = myStr End Select 行 = 行 + 1 Loop End Sub

  • 別シートの行を選択し対象列を転記するマクロ

    シート2のA~F列までデータがあります。 行数は10,000行です。(月ごとに100行くらい追加されます。) A列は項目がNO.で半角数字が連番で入力されてます。 セルA2→1 セルA3→2 セルA4→3 . . . セルA10000→9999 セルA10001→10000 という感じです。 シート1の セルI9に番号を入力すると シート2のその番号の行のB~F列の値を シート1のJ9~N9列に転記したいです。 例えば シート1のセルI9に100と入力したら、 シート2のA列が100と入力されているセルはA101ですから 101行目となります。101行目の各列の値を転記します。 ↓ シート1のセルJ9にシート2のセルB101の値を転記 シート1のセルK9にシート2のセルC101の値を転記 シート1のセルL9にシート2のセルD101の値を転記 シート1のセルM9にシート2のセルE101の値を転記 シート1のセルN9にシート2のセルF101の値を転記 シート1もシート2もセルの書式設定は標準。 B,E,F列は半角英数字の組み合わせで C,D列は半角数字のみです。 たまにF列に空白がある行があります。 B,F列は数字のみの場合もあります。 B,C,D,F列は数字のみの場合 「数値が文字列として入力されています」 となっています。 マクロで行いたいのですが記述そのものを教えてください。

  • エクセル 文字の振り分け

    すみません、教えて頂けますでしょうか。 VBAまたは関数で、1つのセル内にある文字を抽出して、 4つのセルにそれぞれ振り分けたいのですが、 RIGHT、MID、LEFT、FINDを組合せてもうまくできなくて困っています。 例えば1つのセルに、 A1 名前  :松下 小太郎(マツシタ コタロウ) A2 名前  :山田 佐吉(ヤマダ サキチ) のように入っていた場合に、別シート・同一シートのどちらでも良いので、    姓      名     フリ姓     フリ名 B1 松下  C1 小太郎  D1 マツシタ  E1 コタロウ B2 山田  C2 佐吉   D2 ヤマダ   E2 サキチ としたいのですが、松下小太郎が松下まで取り出せても、 名前の長さが変わると、 B2山田 佐 C2 吉 ヤ のようになったりしてしまいます。 VBAでは、 '購入者『姓』 '入力シート“購入者名”の値を変数に格納 myStr = Worksheets("入力シート").Range("B9").Value '変数から":"を検索して、右側を抜出して格納し直す myStr = Right(myStr, Len(myStr) - InStr(1, myStr, ":")) :のところまで左を削る myStr = LEFT(myStr, Len(myStr) - InStr(1, myStr, " ")) 左からスペースまで削る myStr = LEFT(myStr, Len(myStr) - InStr(1, myStr, " ")-1) ・・・・ のようにmyStrに入れた変数を再度削るという風に考えて やってみたのですが、できませんでした。 (上記コードはざっくりとこんな感じにしましたという イメージで書きましたので合っていません。) みなさま、お忙しい最中と思いますが、 何卒お力添えを頂けませんでしょうか? よろしくお願い致します。

  • マクロで指定した処理がうまくいかない

    いつもお世話になります。 エクセル2000で、タイトルを除くと、9行目から17行目までの表があり、その表の列Hの値が 0 の時、その行を非表示にするという下記のマクロを作成したのですが、処理がうまくいかないことがあります。 エラー内容は、たまに9行目のHの値が0なのに、行が表示されたままであるということです。 ’全ての行を表示させてから Rows("9:17").EntireRow.Hidden = False ’列Hの値が0の場合、その行を非表示にする Dim n As Integer For n = 17 To 9 Step -1 If Cells(n, 8).Value = 0 Then Rows(n).EntireRow.Hidden = True n = n - 1 End If Next 原因かどうかは分かりませんが、気づいた点は、その時10行目のHの値も0だったことです。 どうぞ宜しくお願い致します。

  • マクロ、セルの値から行挿入して転記する方法

    エクセル2013です。 セルA1に 1,8,9,15 セルA2に 7,12 セルA3に 20,14,28 と入力されているとします。 For~Nextで回して セルA1のカンマの数を InStr関数で数えて カンマが3個だから その3を変数に入れて それを利用して A2から3行行挿入します。 で カンマで区切られた順に A1には1 A2には8 A3には9 A4には15 と転記させる カンマは消してしまう で、この時点で 元々セルA2だった所は セルA5になっていて 7,12 が入力されているはずです。 で同じくそこを見させて カンマが1個だから A5の下に1行挿入したうえで A5に7 A6に12 と転記 カンマは消す。 すると元々セルA3だった所は セルA7になっていて そこには20,14,28が入力されているはず ここも同じように処理し 下の列へ進めて行く。 カンマが無いセルは 行挿入せず この処理はしないで A列のデータが有る最終行まで 繰り返す。 と いうマクロを作成したいのですが どういう方法で行えばいいか うまく思いつきません。 配列は苦手でなのですが 配列を使わないと無理でしょうか? どうかよろしくお願いします。

  • Excel マクロで連番作成方法を教えてください。

    OS:Windwos2000 Excel2000 以下の内容をマクロで実施する方法を教えてください。 過去の質問を確認しましたが、 私の希望する内容とは分部とはことなるため、 質問させていただきました。 A列に入力されているデータの最終行まで 各B列、C列、D列にオートフィル機能を使って数式コピーを行いたい。 ※A列のデータ数は固定ではなく増減します。 ※B列、C列、D列の先頭行には数式を入力済みです。 ※オートフィル機能でなくても問題ありません。 よろしくお願いいします。 A列     B列      C列     D列      E列 データ   =LEFT(A1,4)  -   =MID(A1,8,14)  =B1&C1&D1 データ   =LEFT(A2,4)  -   =MID(A2,8,14)  =B2&C2&D2 データ   =LEFT(A3,4)  -   =MID(A3,8,14)  =B3&C3&D3 データ   =LEFT(A4,4)  -   =MID(A4,8,14)  =B4&C4&D4 データ   =LEFT(A5,4)  -   =MID(A5,8,14)  =B5&C5&D5 ・

  • ■ エクセルのマクロで出来ますか?

    エクセルマクロの初心者です。 現在、業務で以下の様な表を作成し、請求書の発行を行っています。 「sheet1」A列のNo.を「sheet2」のA列(例えばセルA1)に入力すると VLOOKUP関数で必要項目が請求書の雛形に表示される仕組です。 複数行を抽出する場合は、複数のNo.(例: 1,3,10)を手入力(例: A1,A2,A3・・・)しております。 ----- <sheet1>    A列  B列   C列   D列  ・・・ 1行 No.  項目1  項目2  項目3 ・・・ 2行  1   値1   値2   値3  ・・・ 3行  2   値4   値5   値6  ・・・ 4行  3   値7   値8   値9  ・・・ <sheet2> 請求書の雛形 セルA1~A10に請求書を発行したい<sheet1>A列のNo.を入力。 ----- これを、A列の左に行を挿入、各行にチェックボックスを配置し、 チェックボックスをオンにした行のB列(行挿入前はA列)の値(No.)を 「sheet2」のA列(例えばA1/複数の場合はA1,A2,A3・・・10行程度)に コピーを行う仕組を作ることを検討しています。 複数のNo.をチェック(1,3,10)した場合は、 「sheet2」のA1,A2,A3の様に、上から順になれば理想的です。 説明が悪く、意図が伝わり難いこととは思いますが、 これらの作業を行うマクロ(他の方法も可)を組むことは可能でしょうか。 ご教授いただければ幸いです。 よろしくお願いいたします。

  • エクセルのマクロで

    エクセルのマクロでこんな処理はできるでしょうか? 元データ表に A列からC列まである数値が5000行にわたって入っています。 例     A B C 1行目 1 4 6 2行目 4 7 8 3行目 5 6 4 4行目 7 8 2 ・ ・ 今、1行目と2行目の間に新たな行を挿入し、 C1セルの値を新たに挿入した行のA列からC列に貼り付けたい。 同様に現時点での2行目と3行目の間に新たな行を挿入し 今度はC2セルの値をその行に貼り付けます。 上の例で言うとこうなります。これを最後の行まで繰り返します。     A B C 1行目 1 4 6 2行目 6 6 6 3行目 4 7 8 4行目 8 8 8 5行目 5 6 4 6行目 4 4 4 7行目 7 8 2 8行目 2 2 2 ・ ・ 元データは5000行あるので、都合1万行になるということです。 このような処理はできるでしょうか? お教えいただけたら幸いです。よろしくお願いします。

  • マクロでファイルを選択しデータを引用し編集

    マクロでファイルを選択しデータを引用し編集 マクロを組み込んだエクセルワークブックを 開いて、マクロを起動します。 ファイル選択画面が表示され 使用者がファイルを選択すると そのファイルのデータで以下の編集を行い 終了後は、選択したファイルには手を加えず その選択ファイルは閉じたいです。 ファイル選択メッセージを出す所や 間違ったファイルを選択した場合の回避までは作成済みです。 ファイル選択後の処理をする為のコードを教えてください。 選択したファイルには B~F列にデータが入っています。 最終行数はファイルにより異なりますが2行目からデータです。 F列を検索し、同じ値が合った場合その対象行のB~F列の値を マクロが入ったワークブックのシート名(ERR)の B~F列に転記したいです。 A列には、選択ファイルの対象になった行数を入力する。 同じ値は何種類で何個あるかわかりません。 同じ値が一切ない場合は、全データをマクロが入ったワークブックの シート名(ERR)のB~F列に転記したいです。 (シート名(ERR)が選択したファイルと同じ状態になる) 同じ値があって転記した場合と同じ値が無く 全データを転記した場合で転記終了後にそれぞれ違うメッセージ を表示したいです。 よろしくお願いします。 例(左からB,C,D,E,F列 2行目から9行目 説明の為 , で区切ります B123 , ABC , 777 , A12 , 123 B123 , ddd , 565 , B23 , 124 B128 , XYA , 714 , N12 , 120 B129 , ddd , 565 , B23 , 128 B122 , ABC , 777 , U12 , 127 B127 , ZZZ , 678 , B23 , 123 B125 , ABC , 777 , T12 , 123 B124 , ddd , 424 , 623 , 128 F列の値で 123 が2行目、7行目、8行目 128 が5行目と9行目にある ↓ シート(ERR)に転記 (左からA,B,C,D,E,F列 説明の為 , で区切ります 2 , B123 , ABC , 777 , A12 , 123 7 , B127 , ZZZ , 678 , B23 , 123 8 , B125 , ABC , 777 , T12 , 123 5 , B129 , ddd , 565 , B23 , 128 9 , B124 , ddd , 424 , 623 , 128 例2(左からB,C,D,E,F列 2行目から9行目 説明の為 , で区切ります B123 , ABC , 777 , A12 , 123 B123 , ddd , 565 , B23 , 124 B128 , XYA , 714 , N12 , 125 B129 , ddd , 565 , B23 , 126 B122 , ABC , 777 , U12 , 127 B127 , ZZZ , 678 , B23 , 128 B125 , ABC , 777 , T12 , 129 B124 , ddd , 424 , 623 , 130 F列に同じ値が無いのでシート(ERR)にすべて転記 (左からB,C,D,E,F列 2行目から9行目 説明の為 , で区切ります B123 , ABC , 777 , A12 , 123 B123 , ddd , 565 , B23 , 124 B128 , XYA , 714 , N12 , 125 B129 , ddd , 565 , B23 , 126 B122 , ABC , 777 , U12 , 127 B127 , ZZZ , 678 , B23 , 128 B125 , ABC , 777 , T12 , 129 B124 , ddd , 424 , 623 , 130