エクセルマクロのインプットボックスの使い方

このQ&Aのポイント
  • エクセルマクロを使って作業者に列の選択を促す方法について教えてください。
  • マクロの途中で作業者にマウスで列を選択してもらい、その取得した列番号を使って処理を行う方法を教えてください。
  • 行やセルを選択した場合にオプションやエラーメッセージを表示できる方法を教えてください。
回答を見る
  • ベストアンサー

エクセルマクロ インプットボックスの使い方

エクセル2013です。 マクロの途中で作業者にマウスで列を選択してもらい その取得した列番号を使って、いろいろ処理を行うマクロを作りました。 Sub 実験() Dim マウス選択 As Range Dim 選択列 Dim 選択月表示 Dim 質問 Dim 最終列 Dim 最終行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 On Error GoTo myError Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) 選択列 = マウス選択.Column 選択月表示 = Cells(8, 選択列).Value 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" Else MsgBox "プログラムを中断します" Exit Sub End If ---処理内容---- myError: MsgBox "キャンセルが押されました。プログラム終了します。" End Sub 通常列を選択してくれればインプットボックス内には $V:$V などと表示されますが 行を選択されると $35:$35 などと表示され セルの一部を選択されると $D$40 などと表示されます。 行やセルを選択してもエラーなく最後まで進みますが選択した場所によっては とんでもない結果になってしまいます。 基本、列以外を選択したらメッセージボックスでアラームするか プログラムを停止させたいのですがどのような方法が有りますでしょうか? よろしくお願いします。

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

こんな感じでいかがでしょうか。ご参考まで。 Sub test() Dim マウス選択 As Range Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) If マウス選択.Columns.Count > 1 Then MsgBox "1列を選択してね" Exit Sub End If Set マウス選択 = マウス選択.EntireColumn Debug.Print マウス選択.Address End Sub

gx9wx
質問者

お礼

教えて頂いた内容にて 行を選択した場合は回避できましたが セルを選択した場合には回避できなかったので 教えていただいたのを改良して セルを選択しても回避できるようにしてみました。 どうもありがとうございました。 On Error GoTo myError 'INPUT-BOXでキャンセルを選択した時の回避 Set マウス選択 = Application.InputBox("編集したい月の列を選択してください", Type:=8) If マウス選択.Columns.Count > 1 Then '選択したしたのが列で有り1列であるか確認 MsgBox "選択したのは列ではありません。又は2列以上を選択しています" MsgBox "プログラムを中断します" Exit Sub 'プログラム停止 End If If マウス選択.Rows.Count > 1 Then '選択したのが行の場合の処理 Else MsgBox "セルを選択しています。1列を選択してください" MsgBox "プログラムを中断します" Exit Sub 'プログラム停止 End If Set マウス選択 = マウス選択.EntireColumn Debug.Print マウス選択.Address 選択列 = マウス選択.Column 'INPUT-BOXで選択した列を数字に置き換える 選択月表示 = Cells(8, 選択列).Value '選択した列の8行目のセルの値を格納 Call データ更新3 Exit Sub 'エラーが出なかった時のmyErrorの回避用 myError: 'INPUT-BOXでキャンセルを押した時の処理 MsgBox "キャンセルが押されました。プログラム終了します。" Exit Sub End Sub

その他の回答 (1)

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

セル範囲の行数がエクセルの最大セル数と一致すれば行選択されている とかで判定したらどうでしょうか? Sub 判定() If Range("A:B").Rows.Count <> Rows.Count Then  MsgBox "列を選択してください" End If End Sub ちなみに以下のコードを実行するとイミディエイトウィンドウでは × - A1 × - $A$1 ○ - A:A × - 1:1 × - A1:B1000 のように出力されます。 Sub 判定2() Dim myRng As Variant myRng = Array("A1", "$A$1", "A:A", "1:1", "A1:B1000") For i = 0 To UBound(myRng)  If Range(myRng(i)).Rows.Count = Rows.Count Then   Debug.Print "○ - " & myRng(i)  Else   Debug.Print "× - " & myRng(i)  End If Next i End Sub

gx9wx
質問者

お礼

ちょっと使いこなすのには 私にはハードルが高い見たいです。 ありがとうございました。

関連するQ&A

  • エクセルマクロで列を削除したい

    エクセル2013です。 マクロの途中で列を削除するようにしてあります。 A列~J列、N列~Q列、T列~U列、W列~Y列を一括削除なのですが A列~J列だけは、作業者が選択した1列だけを残して削除をしたいです。 マウスで選択させて、列を指定する所までは作成できましたが 列削除の部分(★の部分)が 思うように作成できず完成できません。 アドバイスをお願いいたします。 Sub 列削除() Dim マウス選択 Dim 選択列 Dim 選択月表示 Dim 質問 On Error GoTo myError 'INPUT-BOXでキャンセルを選択した時の回避 Set マウス選択 = Application.InputBox("回覧用に編集したい月の列を選択してください", Type:=8) If マウス選択.Columns.Count > 1 Then '選択したしたのが列で有り1列であるか確認 MsgBox "選択したのは列ではありません。又は2列以上を選択しています" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If If マウス選択.Rows.Count > 1 Then '選択したのが行又はセルの場合の処理 Else MsgBox "行又はセルを選択しています。1列を選択してください" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Set マウス選択 = マウス選択.EntireColumn Debug.Print マウス選択.Address 選択列 = マウス選択.Column 'INPUT-BOXで選択した列を数字に置き換える 選択月表示 = Cells(2, 選択列).Value '選択した列の8行目のセルの値を格納 If 選択列 > 10 Then '選択したのが11列以上の場合の処理 MsgBox "11列目以降は選択できません" MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If 質問 = MsgBox("選択した月は " & 選択月表示 & " です。いいですか?", vbYesNo) If 質問 = vbYes Then MsgBox "処理を行います" '不要列削除 ★ Union(Columns("A:J"),Columns("N:Q"), Columns("T:U"), Columns("W:Y")).Delete Else MsgBox "プログラムを中断します" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 'プログラム停止 End If Exit Sub 'エラーが出なかった時のmyErrorの回避用 myError: 'INPUT-BOXでキャンセルを押した時の処理 MsgBox "キャンセルが押されました。プログラム終了します。" Application.DisplayAlerts = False Application.DisplayAlerts = True Exit Sub 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

  • エクセルマクロ行削除

    エクセル2013です。 以下の行削除マクロを作りました。 取得した 最終行が20行目として 最終列がZ列として セル Z20 の値が 1以上なら問題なく動作するのですが セル Z20 の値が 0 だとループして終了しません。 どこを修正しても、思うように動作しません。 どこを修正すれば、いいのでしょうか? よろしくお願いします。 Sub 行削除() Dim 最終行 Dim 最終列 Dim 対象行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 For 対象行 = 10 To 最終行 If Cells(対象行, 最終列) = 0 Then Rows(対象行).Delete 最終行 = 最終行 - 1 '削除により最終行が1行減ったので最終行の値を1行減らす 対象行 = 対象行 - 1 '削除により対象行が1行繰り上がったので対象行の値を1行減らす Else End If Next 対象行 Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

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

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • エクセルマクロFor Eachの処理が長い

    エクセル2013です。 皆さんに教えていただいて以下のマクロが完成しました。 サンプルデータ 30行、7列ではあっという間に処理ができたのですが 本番環境 800行、50列ですと 処理時間が長く 青丸がくるくる回っていて、2分後にくらいで終わります。 もう少し早く処理する方法はありますでしょうか? Findで検索して、一括削除? (それはマクロでできるのでしょうか?) よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Or 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • エクセルマクロで計算すると遅い

    エクセル2013です。 表に対して、いろいろな処理を行い 要求された結果になるようにマクロを作成し完成しました。 思ったように動作するのですが処理時間が長すぎます。 自分で調べて、以下の部分が処理を遅くしている原因とわかりました。 ただの計算ですが、シート内に計算式や関数は残したくなくて このようにしましたが、別の方法が浮かびません。 どのような方法が有りますでしょうか? よろしくお願いします。 表は600行、50列。 17列目から49列目までの10行目から595行目までにデータがあります。 50列目は合計値用の空欄です。8行目は項目欄です。 インプットボックスは18~48までしか入力できないようにしてあります。 17列目からインプットボックスで入力した列までの合計値を インプットボックスで指定した列のひとつ前の列に1行づつ処理して転記。 17列目からインプットボックスで指定した列の1列前までまとめて列削除 その後17列目から削除され残った最終列の1列前までの合計値を最終列に転記で 1行づつ処理です。 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 遅延合計欄列 = 選択列 - 1 'INPUT-BOXで選択した列の1列前の列番号を格納。この列に合計値を転記する為 遅延合計末列 = 選択列 - 2 'INPUT-BOXで選択した列の2列前を格納。ここまでの列を削除する為 Cells(8, 遅延合計欄列).Value = "遅延" 'INPUT-BOXで選択した列の1列前の列の8行目を「遅延」と転記しこの列に合計を転記する Cells(8, 遅延合計欄列).Font.Color = -16776961 Cells(8, 遅延合計欄列).Font.Size = 15 Range(Cells(10, 遅延合計欄列), Cells(最終行, 遅延合計欄列)).Interior.Color = 65535 For 計算行 = 10 To 最終行 '10行目から最終行まで繰り返す '17列目からINPUT-BOXで選択した列の1列前の列までの合計値を1列前の列に転記する。10行目から最終行まで Cells(計算行, 遅延合計欄列).Value = WorksheetFunction.Sum(Range(Cells(計算行, 17), Cells(計算行, 遅延合計欄列))) Next 計算行 Range(Columns(17), Columns(遅延合計末列)).Delete '17列目からINPUT-BOXで選択した列の2列前までを列削除 最終列2 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行2 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For 合計行 = 10 To 最終行2 '10行目から最終行まで繰り返す '17列目から最終列の1列前までの合計数数を最終列に転記 Cells(合計行, 最終列2).Value = WorksheetFunction.Sum(Range(Cells(合計行, 17), Cells(合計行, 最終列2 - 1))) Next 合計行

  • 標準モジュールマクロ動作について

    office2010 excelのマクロにて、標準モジュールにて一括の場合と、分割されている場合で動作結果が変わります。 その原因が分からないので教えて頂きたく。 A2セルからR6セルまで、文字列データが入っています。 D列、F列のみ、不特定行が空欄ありです。 D列を検索し、○があったら、行ごと削除します。 C列の最終セルから2行上、1列右のセルを参照し、空欄だったら、A空欄あり のメッセージ表示 E列の最終セルから2行上、1列右のセルを参照し、空欄だったら、B空欄あり のメッセージ表示 マクロ実行前のデータで D2セルが○、D3セルが○、 D4セルが空欄 F4セルが何かしらの文字列あり でマクロを実行させると、 D2セルは空欄、 D4セルが何かしらの文字列あり になります。 メッセージは、A空欄あり のみとなるはずなのですが、 (1)の場合、A空欄あり、B空欄あり と誤りになります。 (2)だとA空欄ありのみ表示されます。 何がおかしいのでしょうか? なお、(1)を2回マクロ実行させると、2回目は、A空欄ありのみ表示です (1)標準モジュール一括の場合 Sub SAKUJO() 'D列で○の非稼働日行を削除 Dim lastRow, r As Long Dim v As Variant 'C列最終行の取得 lastRow = Cells(Rows.Count, 3).End(xlUp).Row 'D列を検索し、非稼働日(○)は行で削除 For Each v In Array("○") For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか Rows(r).Delete '含む場合は行を削除 End If Next r Next v '非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示 If Cells(lastRow, 3).Offset(-2, 1) = "" Then MsgBox "A空欄あり" Else End If If Cells(lastRow, 5).Offset(-2, 1) = "" Then MsgBox "B空欄あり" Else End If End Sub (2)標準モジュール分割の場合 Sub SAKUJO() 'D列で○の非稼働日行を削除 Dim lastRow, r As Long Dim v As Variant 'C列最終行の取得 lastRow = Cells(Rows.Count, 3).End(xlUp).Row 'D列を検索し、非稼働日(○)は行で削除 For Each v In Array("○") For r = lastRow To 2 Step -1 'POINT!最終行から2行目へ If InStr(Cells(r, 4).Value, v) <> 0 Then '指定セルの値が配列内のワードを含むかどうか Rows(r).Delete '含む場合は行を削除 End If Next r Next v test End Sub Sub test() '非稼働日を除き、今日から2日前が空欄だったら、メッセージ表示 Dim lastRow ' C列の最終行取得   lastRow = Cells(Rows.Count, 3).End(xlUp).Row If Cells(lastRow, 3).Offset(-2, 1) = "" Then MsgBox "A空欄あり" Else End If If Cells(lastRow, 5).Offset(-2, 1) = "" Then MsgBox "B空欄あり" Else End If End Sub

  • マクロセルの値によってセルの色を消す

    エクセル2013です。 セルの値が0又は空白の場合でそのセルが色塗りされていたら色を消す というマクロをを作成しました。 ただ700行55列では処理が遅いです。 Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub 対象範囲から対象セルを全部見つけて一括処理すれば早いのではと 以下のマクロを作成してみましたが Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) で構文ERRです。 どこを直せばいいのでしょうか? よろしくお願いします。 Sub 色消2() '2014/8/4 '失敗 Dim 対象範囲 Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 対象範囲 = Range(Cells(10, 17), Cells(最終行, 最終列)) Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) If Not 対象範囲 Is Nothing Then 対象範囲.Interior.ColorIndex = 0 End If End Sub

専門家に質問してみよう