• ベストアンサー

VBA コマンドボタンにおけるコードについて

下記のようなコードを作成しました。 これを簡略化するにはどうすれば良いのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("sheet2").Select Select Case UserForm1.ComboBox1.Text Case Is = Sheets("sheet2").Range("A1").Value Sheets("sheet2").Range("B1").Value = "X" Case Is = Sheets("sheet2").Range("A2").Value Sheets("sheet2").Range("B2").Value = "X" Case Is = Sheets("sheet2").Range("A3").Value Sheets("sheet2").Range("B3").Value = "X" Case Is = Sheets("sheet2").Range("A4").Value Sheets("sheet2").Range("B4").Value = "X" Case Is = Sheets("sheet2").Range("A5").Value Sheets("sheet2").Range("B5").Value = "X" ・ ・ ・ End Select End Sub

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

訂正 Dim r As Integer For r = 1 To 100 If UserForm1.ComboBox1.Text = Sheet2.Cells(r, 1) Then Sheet2.Cells(r, 2) = "X" Next

taka1012
質問者

お礼

ご回答ありがとうございます。 ループですね! これなら私でもわかります。 助かりました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#4です。 >A列にコンボボックスで選択した文字と同じ文字があったら、該当行のB列に"X"を設定する」ということです。 これで少しはっきりしましたが、私にはまだ2,3の状況のバリエーションがあると思うが。 ーー ということなら (1)ForNext繰り返し法(コード行数約5行 (2)Findメソッド利用法(10行近く (3)Match関数利用法(コード行数約3行 などがある。 (2)は初心者には難しい。例はWEB照会すると沢山載ってます。 (3)の例を挙げます。 ーー Private Sub CommandButton1_Click() x = ComboBox1.Value y = Application.WorksheetFunction.Match(x, Range("A1:A5"), 0) Cells(y, "B") = "X" End Sub ーー このようにエクセルやそのVBA固有の知識によるコードは、VB6.0式のコードに比べ、簡潔で、一見してやっていることが見えやすいものが多い(エクセルの知識があってのことだが)。 えくせるVBAをやるなら、VBのForNextなど繰り回し一本でなく、上記で言う(2)(3)も無いか、その都度調べてください。質問するのも良い。 ーー エラー対策を入れて Private Sub CommandButton1_Click() On Error GoTo errrtn x = ComboBox1.Value y = Application.WorksheetFunction.Match(x, Range("A1:A5"), 0) Cells(y, "B") = "X" Exit Sub errrtn: MsgBox "A列に該当なし " End Sub

taka1012
質問者

お礼

ご回答ありがとうございます。 >えくせるVBAをやるなら、VBのForNextなど繰り回し一本でなく、上記で言う(2)(3)も無いか、その都度調べてください はい、わかりました。 関数はあまりわからないので、努力してみます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

疑問点。 (1)ISを必要とするのか 初等解説書では比較演算子以上などを使うときに使われていて、相等のケースは Case 1 で相等のケースを担っている。 (2)こういう書き方をすると変数間の比較は、左辺の全ての値のケースを列挙し尽くして、書かなければならなくなる。 ちょっと奇妙。プログラムはそれをしないように考えるものだと思う。 (3)エクセルVBAで、セルのことを問題にするとき 同一行の項目(データ)は、何かの主題の記述という点でつながっていて、無関係ではないことが多い。 その際右列は、OFFSETプロパティや、Cells(i,c+1)のようなのを使って、指し示せる。 こういうのを使ったらどうですか。 ーー <質問一般論> 一般に、質問で、例示して説明するとき、 (1)例を列挙型 (2)特徴説明するため、文章記述型 があり、ケースバイケースでそれぞれ威力を発揮する。 (1)->(2)が読者にたやすいケースもある。 この質問は(1)の型だが、(2)の型で説明するとどうなるか、 説明を添えてほしかった。 回答者読者も忙しいし、質問の背景がわからないし、波長が合わない記述で(2)が帰納できないこともある。 我流でまさかという考え方で取り組んで質問しているケースもある。 ーー 本件質問も、何をしたいのか、文章で特徴を書いてくれれば、短いコードが紹介できるかもしれないと思いました。 システムを作る方は、両方の力が必要と思う。

taka1012
質問者

お礼

ご回答ありがとうございます。 >説明を添えてほしかった。 「A列にコンボボックスで選択した文字と同じ文字があったら、該当行のB列に"X"を設定する」ということです。 よろしくお願いします。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

こんにちは、 例えば、100行あれば、 以下のようでは、駄目でしょうか。 Private Sub CommandButton1_Click() Dim r As Integer For r = 1 To 100 If UserForm1.ComboBox1.Text = Sheet2.Cells(i, 1) Then Sheet2.Cells(i, 2) = "X" Next End Sub

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> これを簡略化する 要するに、「A列に、指定した文字と同じ文字があったら、該当行のB列に"X"を設定する」って事ですよね? 「Findメソッドで検索する」とか・・・ 例えば ----------------------------- Private Sub CommandButton1_Click() Dim F As Range Dim T As Range Dim s As String Sheets("sheet2").Select s = UserForm1.ComboBox1.Text Set T = Sheets("Sheet2").Range("A:A") Set F = T.Find(s, , , xlWhole) If Not (F Is Nothing) Then F.Offset(0, 1) = "X" End If End Sub ----------------------------- とか・・・

taka1012
質問者

お礼

早速のご回答ありがとうございます。 Findメソッドですか。 今の私では完全には理解できませんが努力してみます。

関連するQ&A

専門家に質問してみよう