[[20070131154738]] 『<コード表?を参照するマクロ処理について教えてください。』  ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『<コード表?を参照するマクロ処理について教えてください。』

 小生50歳になる、VBAマクロについては初心者の者です。
 過去の質問・回答の中にあるのかも知れませんが、見つけることができ
 ないためお願いします。
 下のようにシート1の1行A列,D,G,・・・・・・・,2行A列,D,G,・・・・・・・というよ
 うに順にセルに値をVBA(マクロ)で入力していくとき、その都度シート3
 のリストと照合し、数値がマッチした場合は一つ右のセルに当該文字を入れ
 て当該数値の色を赤にしていくことを考えています。シート1のセルには
 数式等が残らないように、照合した結果マッチするものがないときは空白
 のままにしておき当該数値の色も変えないでおくという条件でマクロで処
 理する方法はmないでしょうか・・・・・
 関数VLOOKUPを使用するのではないかとは思うのですが、上手くいきません。
 また、関数VLOOKUPを使用しない方法があればそれも教えてください。
                                                       (まとな)

イメージ

  シート1                                  
     A  B  C  D  E  F  G  H  I   -    -  V    W   X -
  1  102            103            104  岩沢             109
  2  110            111  山本      112                   117
  3  118            119            120                   125
  -
  -
  7  150            151            152 小川 
  8  158            
  9
  -
  -

  シート3
     A  B  C  D  E   -
  1  岩沢 104
  2 山本 111
  3 小川 152
  4 長崎 158
  5 横川 179
  6  立川 196 
  -
  -

[エクセルのバージョン]
Excel2003
[OSのバージョン]
WindowsXP


 VLOOKUP関数は、コードが左側にないと使えません。範囲がわからないので
 取り合えずですが、下記が一例です。
(純丸)(o^-')b
 
 Sub test()
   Dim dic As Object
   Dim hani As Range
   Dim i As Long
   Dim myr As Range
   Dim lastrow As Long

   Set dic = CreateObject("Scripting.Dictionary")
   Set hani = Worksheets("Sheet1").Range("A1:A10,D1:D10,G1:G10")   '←範囲を設定

   With Worksheets("Sheet3")
     lastrow = .Cells(Rows.Count, 1).End(xlUp).Row
     For i = 1 To lastrow
       dic.Add .Cells(i, 2).Value, .Cells(i, 1).Value
     Next i
   End With

   For Each myr In hani
     myr.Offset(, 1).Value = dic(myr.Value)
   Next myr  

 End Sub


 私はMatch関数で参加。
Sub test()
Dim lng_LastRow As Long, lng_LastCol As Long
Dim C As Range
lng_LastRow = Cells.Find("*", , , , xlByRows, xlPrevious).Row
lng_LastCol = Cells.Find("*", , , , xlByColumns, xlPrevious).Column
For Each C In Range(Cells(1, 1), Cells(lng_LastRow, lng_LastCol))
    C.Font.ColorIndex = 0
    myMatch = Application.Match(C.Value, Worksheets("Sheet3").Range("B1:B6"), 0) 'MATCH(検査値, 検査範囲, 照合の型
    If IsNumeric(myMatch) Then
        C.Offset(0, 1).Value = Worksheets("Sheet3").Cells(myMatch, 1).Value
        C.Font.ColorIndex = 3
    End If
Next C
End Sub

 (川野鮎太郎) 純丸さんまでデクチョナリ・・・。_/ ̄|○ il||li

 ウフフフ、ひそかに勉強しておったのじゃ。(*^^)v
(純丸)(o^-')b

順丸様、ありがとうございました。希望通りの動きです。プログラムを読み解き、今作成中のものに早速生かしてみたいと思います。
川野様、いろいろな方法があるのですね。試してみます。
それにしても、「エクセルの学校」に集まる人達ってすごい!   (まとな)

 解決済みなので、σ(^o^;)も参戦〜
 
 純丸さんの「Dictionary」と、鮎さんの「Find」を組み合わせてみました。
 
Sub まとな()
Dim MyDic As Object
Dim MyA As Variant
Dim i As Long, n As Long
    Set MyDic = CreateObject("Scripting.Dictionary")
    With Worksheets("Sheet3")
        MyA = .Range("A1", .Range("B" & Rows.Count).End(xlUp))
    End With
    For i = 1 To UBound(MyA, 1)
        MyDic(MyA(i, 2)) = MyA(i, 1)
    Next i
    With Worksheets("Sheet1")
        For i = 1 To .Cells.Find("*", , , , xlByRows, xlPrevious).Row
            For n = 1 To .Cells.Find("*", , , , xlByColumns, xlPrevious).Column Step 3
                .Cells(i, n + 1) = MyDic.Item(.Cells(i, n).Value)
            Next n
        Next i
    End With
    Set MyDic = Nothing
    Erase MyA
End Sub
 
 (キリキ)(〃⌒o⌒)b


順丸様、キリキ様、早速試してみたら希望していたとおりの動きで喜んだのですが、一緒に作業している者が文字色の変更が実現されていないと言い出しました。大変失礼ですが、再度お尋ねします。コード表と合致した場合にシート1の数値が入っているセル(A,D,G,・・・・V)の隣のセル(B,E,F,・・・,w)に文字列が入るのですが、そのとき同じシート1の数値が入っているセル(A,D,G,・・・・V)の文字色を赤に、更に隣のセル(B,E,F,・・・,w)に入る文字を赤にすることをマクロで処理するにはどうすればよいのでしょうか。
A,D,G,・・・・V及びB,E,F,・・・,w列のセルの書式設定でフォント色を赤にしておけばすむことですが、のちに空白セルにはフォントの色を黒で入力する予定があるので、いちいちセルの設定を直さなくてはならなくなる処理は避けたいのです。
気のいいことばかり言ってすみません。
 (まとな)

 よく意味がわかりませんが、、、
 条件付書式で色を付けるのはいかがでしょう?
 
 (キリキ)(〃⌒o⌒)b

キリキ様、説明不足ですみませんでした。
イメージ的には以下のようにしたいのです。これをマクロ処理過程で対応したい
のです。
駆け出しの私が考えるに、リストと合致した数値をシート1に発見し、リスト上
の対応する文字列を当該セルに入力する作業時に赤色を指定し、一緒に番号の色
も赤にすることができればよいと思うのですが。
昨日の夜、いろいろと参考書を広げてプログラムの理解に頑張ったのですが、まだ
完全に理解できない状況ですので・・・・・
お叱りを覚悟でお尋ねします。
(まとな)

  シート1                                  
     A  B  C  D  E  F     G  H  I   -    -  V    W   X -
  1  102            103       (赤字)→104  岩沢←(赤字)     109
  2  110     赤字→111  山本←(赤字) 112                   117
  3  118            119               120                   125
  -
  -
  -     ※リストと一致しない他のセルには何もせず、
 -                     黒字入力のままにしておきたい。
  -                 

  シート3
     A  B  C  D  E   -
  1  岩沢 104
  2 山本 111
  3 小川 152
  4 長崎 158
  5 横川 179
  6  立川 196 
  -
  -


 こんな感じではいかが?

 Sub test()
 Dim a, dic As Object, r As Range, i As Integer
 Set dic = CreateObject("Scripting.Dictionary")
 With Sheets("sheet3") '<- リストがあるシート名に変更
     a = .Range("a1",.Range("a" & Rows.Count).End(xlUp)).Resize(,2).Value
 End With
 For i = 1 To UBound(a,1)
     If Not IsEmpty(a(i,2)) And Not dic.exists(a(i,2)) Then dic.add a(i,2), a(i,1)
 Next
 With Sheets("Sheet1").UsedRange '<- 要変更
     For i =  1 To .Columns.Count Step 3
         For Each r In Sheets("sheet1").Range(.Columns(i).Address)
             If dic.exists(r.Value) Then
                 With r.Resize(,2)
                     .Value = Array(r.Value, dic(r.Value))
                     .Font.Color = vbRed
                 End With
             End If
         Next
     Next
 End With
 Set dic = Nothing
 End Sub
 (seiya)

 衝突しました。seiyaさんの後では恥ずかしいけどそのままUP〜。
 一部変えてみました。こういうことでしょうか?
(純丸)(o^-')b

 Sub test()
   Dim dic As Object
   Dim hani As Range
   Dim i As Long
   Dim myr As Range
   Dim lastrow As Long

   Set dic = CreateObject("Scripting.Dictionary")
   Set hani = Worksheets("Sheet1").Range("A1:A10,D1:D10,G1:G10")   '←範囲を設定

   With Worksheets("Sheet3")
     lastrow = .Cells(Rows.Count, 1).End(xlUp).Row
     For i = 1 To lastrow
       dic.Add .Cells(i, 2).Value, .Cells(i, 1).Value
     Next i
   End With

   For Each myr In hani
     If dic(myr.Value) <> "" Then
         myr.Offset(, 1).Value = dic(myr.Value)
         myr.Resize(, 2).Font.ColorIndex = 3
     End If
   Next myr

 End Sub


 条件付書式で出来そうですが、、、
 
1)Sheet1 の A1〜好きな範囲を指定
  ※上記で言えば、A1〜X3 まで
2)書式 → 条件付書式
  「数式が」「=OR(ISNUMBER(A1)*COUNTA(B1),COUNTA(A1)*ISNUMBER(OFFSET(A1,,-1)))」
 【書式】をクリックし、お好きな文字色に設定
 
 以上でいかがでしょう?
 (キリキ)(〃⌒o⌒)b

 該当値の入力を忘れていましたので、コード変更しました
 (seiya)

seiya様、純丸様、キリキ様、早速ありがとうございました。
seiya様のプログラムを始動させたところ、「コンポーネントライセンス情報が見つかりません。」と警告が出て動きませんでした。何か必要なソフト?が必要なのでしょうか。
それにしても、3人の皆様、感謝です。同僚に解決だ!と言えます。(まとな)

 >「コンポーネントライセンス情報が見つかりません。」
 ちょっとした「おまじない」が必要なだけですb
 
 >Set dic = CreateObject("Scripting.Dictionray")
                                           ~~
  Set dic = CreateObject("Scripting.Dictionary")
                                           ~~
 に変更すると、エクセル君の機嫌が直りますw
 (キリキ)(〃⌒o⌒)b


 解決したでしょうから、後出しでこっそり・・・。
 私の書いたのは最初から色は変わったはず・・・_/ ̄|○ il||li

 (川野鮎太郎)


 σ(^o^;)は、こう思いました。
 「順丸さんのと、キリキのは、色が変わらないな〜?」
 「川野さんのは、ちゃんと色が変わるのに」
 「よし、もう一度聞いてみよう」
 
 違ったのでしょうかね???
 (キリキ)(〃⌒o⌒)b


 恐らくそうでしょうね^^
 別に気にはしてませんから・・・_/ ̄|○ il||li

 (川野鮎太郎)          ↑キリキさんの(〃⌒o⌒)bと同じトレードマークw

 >別に気にはしてませんから・・・
 いや、おおいに気ぃにしませう。
 地味な人間は損でんなぁ、お互い(笑
     地味な仲間見つけた(弥太郎)
     派手の三羽ガラス (o^-')b (〃⌒o⌒)b (seiya)


 いや〜、最初っから文字色のことが書いてありましたね。
 まったく気が付きませんでした。申し訳ありません。m(__)m
 順丸、おっと、じゃなくって、(純丸)(o^-')b

 >順丸、おっと、じゃなくって、(純丸)(o^-')b
 あいや!
 最初からかかれてましたね。。。
 携帯からとは言え、失礼ぶっこきました。。。
 準丸さんすいませんm(_ _)m
 なんてねw
 
 ごめんなさいです。
 (キリキ)(〃⌒o⌒)b


 キリキさん、毎度どーもです。
 ありがとうございました。

 (地味なseiya)

キリキ様、動きました。プログラムのタイピングまで確認しませんでした。1字違っても動かないのですね。(当然なのでしょうが!!)
川野様のことが話題になっていますが、川野様のものを順丸様(Test(1))やキリキ様(Test(2)のものと同じモジュール?上において動作させると、Sheet1は変化せず、Sheet3(リストがおいてあるシート)に対して動作が起こってしまうので、どうしてかな?と考えていたのです。
小生が川野様のコードについて尋ねないことが、関係者の方々を不快な気持ちにさせてしまったようですね。川野様をはじめ皆様にお詫びします。
川野様のものが正常に動作しない原因は何なのでしょうか。小生のエクセルがおかしいのでしょうか。
不安になって、VBE画面を確認したところ、プロジェクトエクスプローラに標準モジュール?(Module1)表示がないことに気が付きました。このことが原因でしょうか。
VBE画面最上段に「○○.xls-[Sheet3(コード)]」という表示がありました。他のファイルのマクロでは「○○.xls-[Module1(コード)]」でした。
また、純丸様、キリキ様、seiya様のものを「○○.xls-[Module1(コード)]」とでるところで打ち込み、動作させたところ異常な動作をしてしまいました。これはいったいどうしてなのか。初心者の小生としては?????
お詫びしながら、お尋ねする厚かましさをお許しください。
不安、疑問を解消したいと切に思っています。    (まとな)

 σ(^o^;)も、よくわかりませんが、、、
 
 モジュールには、色々なものがあります。
 標準モジュール・シートモジュールなのです。
 今回、皆さんが提示くださったコードは『標準モジュール』へ貼り付けるべきコードです。
 >VBE画面最上段に「○○.xls-[Sheet3(コード)]」という表示がありました。
 この状態から想像すると、Sheet3の『シートモジュール』に貼付けをしているのではないでしょうか?
 
 VBE画面の、挿入 → 標準モジュール で、出てきた画面に貼付けをして試してみてください。
 (キリキ)(〃⌒o⌒)b


キリキ様、ありがとうございました。動作しました。VBEの操作、そのものの学習もしなければなりませんね。頑張ります。
しかし、川野様のコードではどうしてもB列とE列に合致するものがある場合、数字部分(A列やD列)は赤に色が変わるのですが、マクロ動作結果で自動入力される文字列が赤に変わりません。どこがどう変更すればよいのか???? 分かりません。これも、小生の操作間違いに依るものでしょうか。とほほほ・・・・・  (まとな)

 c.Font.ColorIndex = 3
 ↓
 c.Resize(,2).Font.ColorIndex = 3

 に変更してみてください

 (seiya)

 衝突〜☆
 でも、そのままUP
 
 川野さんではございませんが。。。
 
 >For Each C In Range(Cells(1, 1), Cells(lng_LastRow, lng_LastCol))
 の上に、
 Range(Cells(1, 1), Cells(lng_LastRow, lng_LastCol)).Font.ColorIndex = 0
 を追加 
 
 >C.Font.ColorIndex = 0
 を
 'C.Font.ColorIndex = 0
 
 >C.Font.ColorIndex = 3
 を、
 C.Resize(, 2).Font.ColorIndex = 3
 
 に追加・変更してみてください。
 (キリキ)(〃⌒o⌒)b

seiya様のものに加え、キリキ様のものにより手直しをしたら、正常に動作するようになりました。「何がどうなって、こうなったのか」という点は今は理解できませんが、時間をかけて調べてみます。とにかく、ありがとうございました。
一つの動作を指示するのにも、いろいろなコードが考えられるのだということをまたまた知りました。プログラミング?の奥深さですね。 (まとな)


 みなさん、フォローありがとうございます。m(_ _)m
>当該文字を入れて当該数値の色を赤にしていくことを考えています
 だったため、数値だけ色を変更していました。(^_^A;

 >関係者の方々を不快な気持ちにさせてしまったようですね。
 いえいえ、全然不快になってませんから気にしないでください。

 σ(^_^;)と(〃⌒o⌒)bさんのコミュニケーションのようなものですから。

 (川野鮎太郎)


そう言っていただけると、気持ちが楽になります。
今回、皆様からいただいたことを生かして何とか使えるものを仲間(小生と同じく初心者)と作り上げたいと思います。
また、困ったことがあったらお尋ねします。そのときもよろしくお願いします。
ありがとうございました。               (まとな)

 そそ^^
 コミュニケーションですb
 
 がんばってくださいね^^
 (キリキ)(〃⌒o⌒)b

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.