|
▼どぢょりん さん:
>再度やってみましたら、今回は普通に処理ができました。
>ご迷惑をおかけしました。
あれ?
できちゃったんですか?
とすると、原因は何だったんでしょうねェ
>もしよろしければ、お時間のあるときでいいので、下記の部分の解説をお願いできませんか?
>お恥ずかしい限りですが、"C"や"F"が何を指しているのか、ぜんぜん分かりませんでした。
>
■Cells(行Index, 列Index)
のことですけど、ほんとうはこれ Cells.Item(行, 列) のことなんです。
「Cells」というのはすべてのセルの集合のことで、
「.Item(行, 列)」というのが、その集合の中の単一要素を指定するしかたで、
セルの集合だから、行位置と列位置の2次元座標でセル位置を指定しています。
このとき
Cells.Item(1,3)
とすると [C1]セルのことですが、この 列番号3 の代わりに 列名"C" を使って、
Cells.Item(1, "C")
とも表せますよ、ってことです。集合のなかの要素を指定するための Itemプロ
パティは 省略することができるので、
Cells.Item(1,3) は Cells(1,3) と表すことが多いです(マクロ記録でも)
同様に
Cells.Item(1, "C") は Cells(1, "C") と表すことが多いです。
〔参考〕
Worksheets(1) を Worksheets("Sheet1") と名前を使って表してもいいです。
これも同じことで、「Worksheets」というワークシートのコレクション(集合)
のなかの「第1番目の」シートと指定するときは番号を使い Worksheets(1)
とするけれど、「Sheet1」という名前の特定のシートというときは そのシート
の名前を使って Worksheets("Sheet1") と表すことができるのも、同じ理由
からです。
Worksheets(1) は ほんとは Worksheets.Item(1) という意味なんです。
Worksheets("Sheet1") は ほんとは Worksheets.Item("Sheet1") なんです。
>Do Until IsEmpty(WS2.Range("B1").Value)
> .DrawingObjects.Delete
Sheet3を 1行おきに調べていきます(2行づつ結合されているので)
> For y = 1 To 20 Step 2
もしy行目の C列に文字が書き込まれてなければ、処理終了です
> If Len(.Cells(y, "C").Text) = 0 Then Exit For
>
Sheet2の"F"列にある「仕入先」文字列を取得します
Sheet2の何行目を見ればいいかは、
(y + 1) \ 2 すなわち、Sheet3の現在行+1した値を2で
割った答えが Sheet2の行番号 という関係より計算します。
> ss = WS2.Cells((y + 1) \ 2, "F").Value 'Sheet2仕入先文字列
ss には、たとえば「C社・D社」というSheet2の文字列が代入されます。
Sheet3の仕入れ先リスト範囲を変数r にセットします。
y行目の"F"列から始まる2×2 の範囲です。
> Set r = .Cells(y, "F").Resize(2, 2)
この4つのセルを順に調べます
> For Each c In r
> s1 = c.Value
s1 最初は「A社」次が「B社」その次のセルが「C社」です
↓ssのなかに s1があるか調べます。
> If InStr(ss, s1) Then
↑ ss「C社・D社」のなかに s1「C社」は含まれていますので
↓このセルを○で囲みます
> drawCircle c
そして元のss文字列「C社・D社」から見つかった「C社」
部分を抜き取ります → ss「・D社」 にします。
> ss = Replace(ss, s1, "")
> If Len(ss) = 0 Then Exit For
> End If
> Next
4つの「仕入先候補」セルの巡回が終わって、ssにまだ文字列が
残っていれば「その他」のセルに○を描きます。
> If Len(ss) > 0 Then
ただし「・」はすべて見つかっても残っていますので、
ここで「・」も除いて、まだ見つからなかった仕入れ先が
あったか、調べなくてはなりません。それを以下でやってます。
Compare:=vbTextCompare) というオプションは 全角半角を
問わずすべての「・」を削除という意味です。
> If Len(Replace(ss, "・", "", Compare:=vbTextCompare)) > 0 Then
> drawCircle r.Item(r.Count)
> End If
> End If
|
|