- ベストアンサー
エクセルのVBA「当てはまる場合、コピー」の方法
- エクセルのVBAを使用して、「当てはまる場合、コピー」を行う方法についてお尋ねします。具体的には、A列に番号が連続している場合、B列に番号を入力し、該当する行のC列に「OK」という文字を入力する方法を知りたいです。
- イメージとしては、会員の来場情報を管理する際に使用することを想定しています。A列には会員番号が入力されており、B列には来場した会員の番号を入力します。ボタンを押すと、B列で入力した番号に対応する行のC列に「来場」という文字を自動的に入力する方法を教えてください。
- コピーペーストのVBAやVLOOKUP関数にはある程度の知識がありますが、どのようにVBAを使用すればよいか分かりません。お手数ですが、アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! >ボタンを押すとB列で・・・ とありますので、コマンドボタンを配置しているとしての一例です。 お示しのようにデータは1行目からあるとします。 Private Sub CommandButton1_Click() Dim i, k As Long Application.ScreenUpdating = False Columns(3).ClearContents For k = 1 To Cells(Rows.Count, 2).End(xlUp).Row For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = Cells(k, 2) Then Cells(i, 3) = "OK" End If Next i Next k Application.ScreenUpdating = True End Sub ※ 「OK」の部分を「来場」と変更しても良いかと思います。 こんな感じではどうでしょうか?m(_ _)m
その他の回答 (2)
- keithin
- ベストアンサー率66% (5278/7941)
明らかに関数を使った方が簡単です(あるいはA列に条件付き書式を設定して,来場された番号セルの色を塗ってみるなどでも)が,そこを敢えてマクロを使うなら,こんなこともできます。 手順: シートを開く シート名タブを右クリックしてコードの表示を選ぶ 現れたシートに下記をコピー貼り付ける private sub worksheet_change(byval Target as excel.range) dim h as range dim c as range set target = application.intersect(target, range("B:B")) if target is nothing then exit sub for each h in target if h <> "" then set c = range("A:A").find(what:=h.value, lookin:=xlvalues, lookat:=xlwhole) if c is nothing then msgbox h.value & " is not registerd" h.interior.color = vbred else c.offset(0, 2) = "OK" end if end if next end sub ファイルメニューから終了してエクセルに戻る A列を準備した後,B列にどんどん記入していく。 #折角マクロを使うのなら ・未登録の番号がB列に記入されたら警告する ・既にB列に記入済みの番号が再度記入されたら警告する ・単にOKと出力するんじゃなく,たとえば記入時刻を記録してみる など,色々思いつくまま応用を効かせてみてください。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! たびたびごめんなさい。 投稿後に思ったのですが・・・ VBAでなくても関数の方が簡単だとおもいます。 C1セルに =IF(COUNTIF(B:B,A1),"OK","") という数式を入れあらかじめオートフィルでずぃ~~~!っと下へコピーではダメでしょうか? 何度も失礼しました。m(_ _)m