- ベストアンサー
VBAのコードでApplication.InputBoxを使用してセルを選択する方法
- VBAのコードを使用して、Application.InputBoxを利用してセルを選択する方法について教えてください。
- 具体的には、マクロを実行した後に処理する範囲のセルを選択したい場合のコードについて教えてください。
- また、対象セルは1つの文字ずつ入力されており、範囲も複数の列で指定される場合についても教えてください。
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
それ以降に「同じ箇所」があった場合に連続技を利用するのに MsgBoxの YesNoCancelの三択を利用したらいかがでしょう。確認と問い合わせを一度のMsgBoxで処理します。 'どこにあるか?表示し、実行動作確認 YesNoCancel = MsgBox(n - 1 & "/" & Total & " : " & str & vbLf _ & vbLf _ & F_Num & "文字目から" & vbLf _ & E_Num & "文字目まで" & vbLf & vbLf _ & "以降変名は、全て同じ箇所ですか?", vbYesNoCancel + vbQuestion, "問い合わせ") 'アクティブ色を元に戻す (黒色) Target.Font.Color = vbBlack If YesNoCancel = vbCancel Then Exit Sub End If Ws1.Activate If YesNoCancel = vbYes Then For nn = n To Ws1.Cells(Rows.Count, 1).End(xlUp).Row Ws1.Cells(nn, "B") = Left(str, F_Num - 1) & Mid(str, E_Num + 1) Next
その他の回答 (14)
- kkkkkm
- ベストアンサー率66% (1725/2595)
> str="Range" <-----”Range"はイメージで実際は数式等になると思われるます? > のように変数strに求めたいです。 なるほど > 上記の場合は、Rangeが求める文字列です。 これは単にセルに入っているこの文字を取得するのだと思ってました。 以下で試してみてください。 Sub Test2() Dim Target As Range Dim i As Long, str As String Set Target = Application.InputBox("セルを選択してください", Type:=8) For i = 1 To Target.Columns.Count str = str & Target.Item(i) Next Range("A4").Value = str End Sub
- kkkkkm
- ベストアンサー率66% (1725/2595)
範囲が複数列になる場合は Range("BC3").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Count).Value を Range("BC3").Resize(Target.Rows.Count, Target.Columns.Count).Value = Target.Item(1).Resize(Target.Rows.Count, Target.Columns.Count).Value また最初の Resize(1, Target.Count) は Resize(1, Target.Columns.Count) にしておくと間違って次の行まで選択しても選択した範囲の列数が対象になります。 Target.Countはセル数なので。
- kkkkkm
- ベストアンサー率66% (1725/2595)
単にセルのコピペでしたら Range("BC3").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Count).Value としなくても Target.Copy Range("BC3") (式は式としてコピペされます)
お礼
kkkkkmさん、今回も回答頂きありがとうございます。 >Target.Address >で >$BJ$2:$BN$2 >が取得出来ますが 確かに、Target.Addressで最初の「$BJ$2」だけでなく「$BJ$2:$BN$2」が取得できました。 ほしいのは、この「$BJ$2:$BN$2」内の文字列です。 1文字ずつプラスして5文字文で「Range」です。 最終的には Dim str As String str="Range" <-----”Range"はイメージで実際は数式等になると思われるます? のように変数strに求めたいです。 >ws2.Range("a4").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Count).Value 上記では、"a4" ,"b4","c4","d4","e5" に”R”、”a”、”n”、”g”、”e” と表示されます。 結果は、分割したセルでは無く1つのセルに求めたい つまり、上記の変数strに求めたい >ws2.Range("a4").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Count).Value >Target.Copy.ws2.Range ("A4") <---- ここでエラー表示 上記を記載しましたが、Targetの所でエラー「オブゼクトが必要です」が表示されます。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> 必要な文字列としては > Selection.Addressで「$BJ$2:$BN$2」です。 Target.Address で $BJ$2:$BN$2 が取得出来ますが その範囲をどこかに代入する場合は Range("BC3").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Count).Value みたいになるような感じです。 > Targetで求めるアドレスは最初の「$BJ$2」だけ 最初のセルだけ選択するという意味でしたら Sub Test1() Dim Target As Range Dim EndCol As Long Set Target = Application.InputBox("セルを選択してください", Type:=8) EndCol = Cells(2, Target.Item(1).Column).End(xlToRight).Column Range("BC4").Resize(1, EndCol - Target.Column + 1) = Target.Item(1).Resize(1, EndCol - Target.Column + 1).Value End Sub で試してみてください。
- 1
- 2
補足
追加のアドバイスを受けて下記のように変更しました。 Dim Target As Range Set Target = Application.InputBox("セルを選択してください", Type:=8) MsgBox Target.Address ws2.Range("a4").Resize(1, Target.Count).Value = Target.Item(1).Resize(1, Target.Columns.Count).Value ws2.Range("a5").Resize(Target.Rows.Count, Target.Columns.Count).Value = Target.Item(1).Resize(Target.Rows.Count, Target.Columns.Count).Valuews 'Target.Copy.ws2.Range ("A4") ws2.Range("a4").Resize(1, Target.Count).Value = ---- の方は上手く表示されています。 ws2.Range("a5").Resize(Target.Rows.Count, ----- の方も表示されましたが 結果は、"a4"と"a5"の表示は、全く一緒で1セルに1文字のずつ表示されます。