アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなコードを作成しました。
これを簡略化するにはどうすれば良いのでしょうか?
よろしくお願いします。

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

A 回答 (5件)

訂正



Dim r As Integer

For r = 1 To 100

If UserForm1.ComboBox1.Text = Sheet2.Cells(r, 1) Then Sheet2.Cells(r, 2) = "X"

Next
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/26 20:26

#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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/27 20:17

疑問点。


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

ご回答ありがとうございます。
>説明を添えてほしかった。

「A列にコンボボックスで選択した文字と同じ文字があったら、該当行のB列に"X"を設定する」ということです。
よろしくお願いします。

お礼日時:2007/07/26 23:06

こんにちは、



例えば、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
    • good
    • 0

> これを簡略化する


要するに、「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
-----------------------------
とか・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/26 20:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!