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

どなたかご存じでしたら回答をお願いします。
ナンバーズ3やナンバーズ4の予想をする上で、
下記の手順でマスターにしか存在しない予想数字を、
ボタンを押下したら、(3)の結果だけが出てくるようにするには
エクセルVBAではどのようなコーディングでできますか?
これまでは、VLOOKUP等の関数を使用してましたが、
毎回、毎回セルに予想数字を貼りつけて、関数も貼りつける作業が
面倒くさくなり、エクセルでシート予想数字の貼り付け後は、
ボタン押下したらマッチング結果がでてくるものが作りたく質問しました。

(1)こだわりの予想数字が入ったシート。【マスター】
 :
056
067
078
089
125
126
127
128
129
145
156
167
178
189
235
236
 :

(2)WEBサイトにある予想数字を貼りつけたシート【トラン】
 :
056
069
083
085
136
138
158
174
178
194
196
236
247
249
269
285
 :
(3)(1)に対して(2)の数字をマッチングして(1)のみに存在する結果を出力する。
056
178
236

【注意事項】
 ・(1)、(2)ともそれぞれの予想数字の中には重複は無しとします。
 ・(1)、(2)とも昇順に並べてある状態とします。
 ・(1)、(2)とも件数は最大999件とします。
 ・(1)、(2)、(3)それぞれシートは別れていても、同じ1枚のシートでもどちらでもよいです。
 ・エクセルVBAと言いましたが、予想数字をシートに貼り付ける作業以外は自動になれば
  やり方は問いません。 
 ・エクセル2007を使用します。

以上、よろしくお願いします。

A 回答 (4件)

こんばんは!


すべて自動とはいきませんが・・・
VBAでの一例です。

↓の画像でA列が「予想数字」・B列に予想数字をコピー&ペーストするとします。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので
↓のコードをコピー&ペーストしてマクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub test() 'この行から
Dim i, j As Long
Application.ScreenUpdating = False
j = Cells(Rows.Count, 3).End(xlUp).Row
If j > 1 Then
Range(Cells(2, 3), Cells(j, 3)).ClearContents
End If
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If WorksheetFunction.CountIf(Columns(2), Cells(i, 1)) Then
Cells(Rows.Count, 3).End(xlUp).Offset(1) = Cells(i, 1)
End If
Next i
Application.ScreenUpdating = True
End Sub 'この行まで

※ コマンドボタンを使えば、クリックするだけでマクロを走らせることが可能です。

ご希望の方法でなかったらごめんなさいね。m(_ _)m
「マッチングの簡素化」の回答画像2
    • good
    • 0
この回答へのお礼

いつもお世話になります。
早速のご回答ありがとうございます。
私が意図していた形の回答を頂き嬉しいです。
さっそく、試してみます。

お礼日時:2011/12/24 00:32

>これまでは、VLOOKUP等の関数を使用してましたが、


>毎回、毎回セルに予想数字を貼りつけて、関数も貼りつける作業が
>面倒くさくなり、エクセルでシート予想数字の貼り付け後は、
関数を張り付ける作業をマクロの自動記録で記録しても良いと思います。
その後の作業も記録してみてください。
[Alt]+[F11]でプログラムの中身を見てみましょう。
標準モジュール内です。(記録中も見られます)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
マクロの自動記録の方法ですか、
思いつきませんでした。
ありがとうございます。

お礼日時:2011/12/24 11:58

丸写しすれば仕舞いのような解答は出ているようだが、こんなので、出来ました、といっていると進歩しないよ。


だからコードは書かない。1つの方法でも自力でやって見ては。
ーー
例えば
色々なロジックがあるが
(1)探す対象 Sheet1  のA列
(2)探す数字 Sheet2  のA列
として、
(1)Sheet1のA列のセル範囲Rangeが、その作業の都度変わるようだから、最終行(d1)を掴み(このコードぐらいわかるだろう)
Range(”A2:A" &d1)でセル範囲が出来る
(2)Sheet2のデータも同じく最終行をd2に掴む。
そしてSheet2の2行目から最終行までの各セルをFor Nextで繰り返し検索語にする。
(3)FindメソッドでSheet2の語(1セルの値)でSheet1のA列を検索する。
(4)見つかればそのB列にサインとして1でも立てる。
(5)Sheet2の最終行までFindを実行して、Sheet1でB列に1となってない行を、捜してどこかへ抜き出す
ーー
(6)そもそも1件の検索はマクロの記録をやってみよ。どういうコードかすぐ判る。これもやっていないで質問しているのか。
(7)見つからない場合の処理は,Googleででも「VBA Find 見つからない」で照会でもしたか。
http://officetanaka.net/excel/vba/cell/cell11.htm
ほか多数の記事があるじゃないか。
===
ほかのロジックだが、両者ソートして、マッチングのアルゴリズムというのを使う方法(オフラインバッチ処理でよく使われる)があるが、質問者には説明が長くなるので略。わたしも回答に使ったことがあるが。
===
質問は情況を説明するので精一杯のようだ。
ロジックを自分で考え出す訓練をしないと、VBAの文法やメソッドを覚えても先に進めない。
これは経験を積まないと、整理して解説した書物は見つけにくいのだ。
幼稚なロジックでも自分で1方法なり、数日掛けて考えること。WEBに直ぐ質問してはだめ。
    • good
    • 0
この回答へのお礼

いつもご指導ありがとうございます。
確かにスキル以上の事を質問していて
回答がすぐ得られるので満足している所はあります。
それは、予想数字を抽出(決定)するための補助として
エクセルを使用するという考えがあるので、
1から分厚いエクセルの本を見ても自分がやりたい事がそのまま載っている
訳でなくロジックを1つずつ考えていても終わりが見えないため、
それなら皆様に質問して得た回答で得たい結果が得られればそれで良いと思ってます。
なので、今後もこのような質問はすると思いますがご容赦下さい。
しかし、ご指摘の通り単純なロジックから考える事の積み重ねである事は解っています
ので、こちらは、亀のペースで勉強してゆきます。

お礼日時:2011/12/24 11:56

マスターシートのA列のデータと別シートのA列に貼り付けたデータで重複するデータを抜き出すなら以下のような関数で表示できます。



=IFERROR(SMALL(IF(COUNTIF(マスター!$A$1:$A$1000,Sheet2!$A$1:$A$1000),$A$1:$A$1000),ROW(A1)),"")

配列数式ですので入力後Ctrl+Shift+Enterで確定して適当数オートフィルコピーしてください。
再計算に時間がかかる場合は、Excelのオプションの詳細設定から計算方法を「手動」にして、必要な時に(データをコピー後に)F9キーを押すことで再計算した方が動きが軽くなるので良いと思います。
    • good
    • 0
この回答へのお礼

いつもお世話になります。
早速のご回答ありがとうございます。
ちょっと試してみます。

お礼日時:2011/12/24 00:31

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