- ベストアンサー
対話型で入力された情報にて処理を行うマクロ
- 対話型で入力された情報を元に、Excelのマクロをバージョンアップさせたいです。
- 現在のマクロでは、対象値のある列を選択して、別の列に転記する処理を行っています。
- バージョンアップさせたい内容として、入力値にエラーチェックを実装し、再入力が可能になるようにしたいと考えています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ご質問の部分(さっきのEndの前)しか見ていなかったのですが、 ご提示の > 行 = 2 > Do > '対象値列にデータがあるまで繰り返す > n = Cells(行, 1).Value だと、いくら対象列を選んでも、これじゃA列のデータしかみてないですよ。 あと、列の挿入位置が違ったようでそれも修正しました。 > また連続操作が出来ません。 意味不明。 Sub ハイフン挿入05() Dim 対象値列 As Range, 転記列 As Range Dim myStr As String, n As String Dim 列挿入 As Integer Dim 行 As Long, c(1) As Long On Error Resume Next Set 対象値列 = Application.InputBox("対象値のある列をマウスで選択してください", "必ず選択", Type:=8) On Error GoTo 0 If 対象値列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If c(0) = 対象値列.Column 列挿入 = MsgBox("列挿入し、そこに転記しますか?", vbYesNo + vbQuestion, "(^∇^)?") line01: If 列挿入 = vbYes Then On Error Resume Next Set 転記列 = Application.InputBox("挿入したい列の次の列をマウスで選択してください。" & _ vbNewLine & "例:H列とI列の間→I列を選択", "必ず選択", Type:=8) On Error GoTo 0 If 転記列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If If 転記列.Column <= c(0) Then MsgBox "対象列がずれます。" & 対象値列.Address(0, 0) & "より右を選択してください。", vbCritical, "Σ( ̄ロ ̄lll) " GoTo line01 End If Else On Error Resume Next Set 転記列 = Application.InputBox("転記する列をマウスで選択してください。", "必ず選択", Type:=8) On Error GoTo 0 If 転記列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If If 転記列.Column = c(0) Then MsgBox "対象列の元の値が削除されてしまいます。" & 対象値列.Address(0, 0) & "以外を選択してください。", vbCritical, "Σ( ̄ロ ̄lll)" GoTo line01 End If End If c(1) = 転記列.Column If 列挿入 = vbYes Then Columns(c(1)).Insert Shift:=xlToRight End If 行 = 2 Do n = Cells(行, c(0)).Value If n = "" Then Exit Do If Len(n) = 14 Then Select Case True Case Left(n, 2) = "9X" And InStr(n, "-") = 0 myStr = Left(n, 3) & "-" & Mid(n, 4) Case Mid(n, 9, 1) = "-" myStr = Left(n, 3) & "-" & Mid(n, 4, 11) Case Left(n, 1) = "9" And InStr(n, "-") = 0 myStr = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 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) Case Else myStr = n End Select Else myStr = n End If Cells(行, c(1)) = myStr 行 = 行 + 1 Loop End Sub
その他の回答 (4)
- jcctaira
- ベストアンサー率58% (119/204)
gx9wxさん こんにちは。 正直このスペースでの回答を厳しいですが、入力の部分だけを対応してみました。 ※列の入力チェックは(1)だけではなく(2)(3)も必要だと思います。 ※(2)のエラーメッセージ(「対象列がずれます。●●以外を…)も違うと思いますが…。 ※InputBoxで「キャンセル」ボタンの対応はしていません。 下記のサンプルをベースに、細かな所はgx9wxさんで修正してください。 Sub ハイフン挿入02() Const 対象列mess = "対象値のある列を入力してください" Const 列挿入mess = "列挿入しそこに転記しますか?" Const 転記列mess = "転記する列を入力してください" Const 転記挿入mess = "挿入したい列を入力してください。例:H列とI列の間→H" Const 転記列Emess = "対象列の元の値が削除されてしまいます。@列以外を入力してください。再入力しますか?" Const 転記挿入Emess = "対象列がずれます。@列以降を入力してください。再入力しますか?" Do If 列入力(対象列mess, 対象値列, 対象値列NO) = False Then Exit Sub 列挿入 = MsgBox(列挿入mess, vbYesNo) If 列挿入 = vbYes Then If 列入力(転記挿入mess, 転記列, 転記列NO) = False Then Exit Sub If 転記列NO <= 対象値列NO Then If MsgBox(Format(UCase(対象値列), 転記挿入Emess), vbYesNo) = vbNo Then Exit Sub Else Exit Do End If Else If 列入力(転記列mess, 転記列, 転記列NO) = False Then Exit Sub If 転記列NO = 対象値列NO Then If MsgBox(Format(UCase(対象値列), 転記列Emess), vbYesNo) = vbNo Then Exit Sub Else Exit Do End If End If Loop : : End Sub Function 列入力(メッセージ, 列番号, 列番号NO) As Boolean On Error Resume Next Do 列入力 = True 列番号 = UCase(InputBox(メッセージ)) Err.Clear 列番号NO = Cells(1, 列番号).Column If Err.Number = 0 Then Exit Function 列入力 = False If MsgBox("入力値が違います。A~IV のいずれかを入力してください。再入力しますか?", vbYesNo) = vbNo Then Exit Function Loop End Function
お礼
Function はまだまったく理解していない為、 >細かな所はgx9wxさんで修正してください。 とても修正が出来ません。申し訳ありません。 また列挿入がされない為 Columns(転記列).Insert Shift:=xlToRight をどこかに入れるのでは?と思うのですが それもわかりません。 お時間をとっていただきありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
> Endが怪しいと思い、 > 削除したら思ったように動きました。 ごめんごめん、お尋ねになったこととは無関係な部分を止めてました。 消すのをわすれちゃった。 (*/o\*)恥ずかしい・・・。
お礼
ありがとうございます。 03も04も 列挿入→No で列を指定すると どこかの列を指定列にコピーするみたいです。 で不思議なのはその処理が終了した状態でそのシートで 02を走らせると、02も03,04と同じ動きになってしまう事です。 ちょっと混乱しています。
補足
すいません。 データの問題のようです。 A~F列にデータがあって 手動で A列に挿入し A列がB列になった状態で マクロを走らせると、おかしな動きになります。 通常はこのような事はありませんので 私の操作ミスです。 お騒がせしました。
- merlionXX
- ベストアンサー率48% (1930/4007)
すみません、さきほどのコードはキャンセル処理がいいかげんでした。 修正しましたが、文字数制限に引っかかったので、コメントとインデントはすべて消しました。 あしからず。 Sub ハイフン挿入04() Dim 対象値列 As Range, 転記列 As Range Dim myStr As String, n As String Dim 列挿入 As Integer Dim 行 As Long, c(1) As Long On Error Resume Next Set 対象値列 = Application.InputBox("対象値のある列をマウスで選択してください", "必ず選択", Type:=8) On Error GoTo 0 If 対象値列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If c(0) = 対象値列.Column 列挿入 = MsgBox("列挿入しそこに転記しますか?", vbYesNo + vbQuestion, "(^∇^)?") line01: If 列挿入 = vbYes Then On Error Resume Next Set 転記列 = Application.InputBox("挿入したい列の前列をマウスで選択してください。" & _ vbNewLine & "例:H列とI列の間→Hを選択", "必ず選択", Type:=8) On Error GoTo 0 If 転記列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If If 転記列.Column <= c(0) Then MsgBox "対象列がずれます。" & 対象値列.Address(0, 0) & "より右を選択してください。", vbCritical, "Σ( ̄ロ ̄lll) " GoTo line01 End If Else On Error Resume Next Set 転記列 = Application.InputBox("転記する列をマウスで選択してください。", "必ず選択", Type:=8) On Error GoTo 0 If 転記列 Is Nothing Then MsgBox "きゃんせる", , "ヾ( ̄□ ̄; )ノ" Exit Sub End If If 転記列.Column = c(0) Then MsgBox "対象列の元の値が削除されてしまいます。" & 対象値列.Address(0, 0) & "以外を選択してください。", vbCritical, "Σ( ̄ロ ̄lll)" GoTo line01 End If End If c(1) = 転記列.Column If 列挿入 = vbYes Then Columns(c(1)).Insert Shift:=xlToRight End If End 行 = 2 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 myStr = Left(n, 3) & "-" & Mid(n, 4) Case Mid(n, 9, 1) = "-" myStr = Left(n, 3) & "-" & Mid(n, 4, 11) Case Left(n, 1) = "9" And InStr(n, "-") = 0 myStr = Left(n, 5) & "-" & Mid(n, 6, 5) & "-" & Mid(n, 11, 2) & "-" & Mid(n, 13, 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) Case Else myStr = n End Select Else myStr = n End If Cells(行, c(1)) = myStr 行 = 行 + 1 Loop End Sub
お礼
ありがとうございます。 03同様に End If End 行 = 2 Do の Endを削除したら動きました。 ・最初対象列をC列にします。 ・挿入→No ・転記列選択 ・C列→ERR(正) ・D列選択→編集はされずどこかの列の値をコピーします(NG) また連続操作が出来ません。 ・対象列をB列 ・挿入選択 ・D列→成功 ・そのシートで再マクロ ・対象列をB列 ・挿入選択 ・F列→どこかの列の値がコピーされます。 これは03も同じでした。 連続動作ですが02は大丈夫でした。 私の操作が違っているのかも知れません。 もう少しやってみます。
- merlionXX
- ベストアンサー率48% (1930/4007)
こんにちは。 > (1) > インプットBOX-1,2,3はエクセルの列の入力なので > A~IV以外の入力はエラーとして ならば、最初からRangeしか入らないようにして、マウスで選択させたら? こんな感じ? Sub ハイフン挿入03() Dim 対象値列 As Range, 転記列 As Range Dim myStr As String, n As String Dim 列挿入 As Integer Dim 行 As Long, c(1) As Long Set 対象値列 = Application.InputBox("対象値のある列をマウスで選択してください", "必ず選択", Type:=8) If 対象値列 Is Nothing Then MsgBox "きゃんせる" c(0) = 対象値列.Column 列挿入 = MsgBox("列挿入しそこに転記しますか?", vbYesNo + vbQuestion, "(^∇^)?") line01: If 列挿入 = vbYes Then Set 転記列 = Application.InputBox("挿入したい列の前列をマウスで選択してください。" & _ vbNewLine & "例:H列とI列の間→Hを選択", "必ず選択", Type:=8) If 転記列.Column <= c(0) Then MsgBox "対象列がずれます。" & 対象値列.Address(0, 0) & "より右を選択してください。", vbCritical, "Σ( ̄ロ ̄lll) " GoTo line01 End If Else Set 転記列 = Application.InputBox("転記する列をマウスで選択してください。", "必ず選択", Type:=8) If 転記列.Column = c(0) Then MsgBox "対象列の元の値が削除されてしまいます。" & 対象値列.Address(0, 0) & "以外を選択してください。", vbCritical, "Σ( ̄ロ ̄lll)" GoTo line01 End If End If c(1) = 転記列.Column If 列挿入 = vbYes Then Columns(c(1)).Insert Shift:=xlToRight End If End 行 = 2 Do n = Cells(行, 1).Value If n = "" Then Exit Do If Len(n) = 14 Then '対象列は14文字である事 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(行, c(1)) = myStr 行 = 行 + 1 Loop End Sub
お礼
こんにちは。 ありがとうございます。 なかなか回答がつかなかったので マクロでの対応は無理なのかな?と思いました。 で教えていただいた記述ですが途中で動きませんでした。 End If End 行 = 2 Do この行=2の前の Endが怪しいと思い、 削除したら思ったように動きました。
お礼
>だと、いくら対象列を選んでも、これじゃA列のデータしかみてないですよ。 確かにそうです。申し訳ありません。m(__)m 意地悪テストでの誤動作はこれが原因でした。 >> また連続操作が出来ません。 >意味不明。 これも上記が原因でした。忘れてください。m(__)m 05は、 全ての条件において完璧でした。 どうもありがとうございました。