義理チョコも、もらえなかったKen3です。
(自分へ一言、、、おいおい、メルマガに関係ネエだろが、、、そうですね)
ってのは、置いといて、(あと、チョコ画像シャレで送るの止めてください、)
今回は、久しぶりに、Excel VBA 関係?です。
*なんて大きく言ってますが、たいしたことないです。
あっ、逃げないで下さい、そろそろ、まじめに始めますから。
下記の質問をいただきました。チョット長めですが。
------------------------------------------------------
>マクロの記録くらいは前から使ってたんですが、
>最近VBAの方に近寄りつつある初心者です。
>
>で、今、作成しているマクロがうまくいきません。
>多分とっても初歩な部分が判ってないからだとは
>思うんですが、どうしていいやらさっぱりです。
>
>すみません。お手数ですが、是非、ご教授下さい。
>
>やりたいこと。
>・x1・x2とy1・y2の2組の数値の比較結果(大小)から、
>該当する図形(□が二つ組み合わさったもの)を判断し、
>各項目の下に貼り付けたい。(項目は全部で10個)
>
>今出来ていること。
>・数値を判断して、"AI4:AM4", "AI6:AM6"の各セルに
>"Case1"〜"Case4"を表示。(シート上(IF)で処理)
>・基本図形(4通り)にそれぞれ"Case1"〜"Case4"の
>名前を付け、上記セルの値に応じてそれぞれをコピーする。
>(この部分は以下の様にかきました)
>
> For Each BoxRange In ActiveSheet.Range("AI4:AM4", "AI6:AM6")
> Select Case BoxRange
> Case Is = "Case1"
> Case1.Copy
> Case Is = "Case2"
> Case2.Copy
> Case Is = "Case3"
> Case3.Copy
> Case Is = "Case4"
> Case4.Copy
> End Select
> ※
> ActiveSheet.Paste
>
>"AI4:AM4", "AI6:AM6"の下("AI5:AM5", "AI7:AM7")に
>それぞれ、どこに貼りつけるか、セル番地を入れてます。
>(D2,D16,D30,D44・・,O44,O48といったように)
>
>※の処にどう書けば、うまく動いてくれるのでしょうか?
>
>OffsetとCollectionの辺りをじたばた試してみましたが、
>だめでした。書き方が間違ってたのかも・・。
>
>きっとす・・・ごくつまらない質問だと思います、すみません。
>でも・・もうどうしていいか判らない状態になってしまいました。
>
>VBAの入口でじたばたしている私に救いの手を。
>どうかよろしくお願い致します。
------------------------------------------------------
なんか、おしい、、あと少しって気がする。
ここまで、できてれば、と思いますが、勝手にあとひと押し作ってみます。
*実行サンプルをダウンロードして、動きをみてください。
まずテストで、下記のようなテストの表を作成します。
A B C D E F G H I J K L
1
2 Case1 Case2 Case3 Case4 Case2
3 B6 B7 C8 C9 A10
4 Case2 Case3 Case4 Case3 Case4
5 A6 E8 F10 C12 A12

処理内容は、H2:L2,H4:L4の範囲を選択し、
条件を判断します(文字列、Case1から4まででどの画像をセットするか判断)
判断後、目的の画像を選択します。
次に、その下のセルの番地へ、画像を貼り付けます。
これを範囲数分繰り返します。
'--- 下記、私が作成したサンプルです
Sub Macro1()
Dim boxrange As Range '処理範囲
Dim x As Integer
Dim y As Integer
'さてと、ループで回しますか、、、
For Each boxrange In ActiveSheet.Range("H2:L2,H4:L4")
'位置を取りだし、ワーク変数に代入
x = boxrange.Column
y = boxrange.Row
'中身をテストで表示
MsgBox Cells(y, x) & "を判断して" & Cells(y + 1, x) & "にセット"
'セットしたい図形をselect文で判断
Select Case boxrange
Case "Case1"
ActiveSheet.Shapes("case1").Copy
Case "Case2"
ActiveSheet.Shapes("case2").Copy
Case "Case3"
ActiveSheet.Shapes("case3").Copy
Case "Case4"
ActiveSheet.Shapes("case4").Copy
Case Else
'選択されない時、どうすんの? エラーチェックは?
End Select
'セットする位置(D10)などの文字を取りだし、そのセルを選択
Range(Cells(y + 1, x)).Select 'ポインタみたいな間接参照?
ActiveSheet.Paste 'コピーした図形を貼る
Next
'適当なセルを選択して、終わりにする(図形が選択されたままなので)
Range("H7").Select
'エラー処理入っていないけど、こんな感じです。
'素朴な疑問、データを変更して、再実行した時、前回の図形を消したいのでは?
End Sub
'----------------------------------------------------------------
とりあえず、実行結果は下記のようになります。

ポイントは、
範囲数分繰り返したいので、Rangeオブジェクトを使用し、
For Each文で回します(コレの詳細解説も、宿題だなぁ、、、たぶん)
>For Each boxrange In ActiveSheet.Range("H2:L2,H4:L4")
次のポイントが、.Column , .Row プロパティを使用して、
現在処理中のセルの位置を取り出します。
> '位置を取りだし、ワーク変数に代入
> x = boxrange.Column
> y = boxrange.Row
でセルの位置がわかるので、
それを使用して、今度はYに1を+した(一行下の文字を取り出します)
> 'セットする位置(D10)などの文字を取りだし、そのセルを選択
> Range(Cells(y + 1, x)).Select 'ポインタみたいな間接参照?
^^^^^^^^^^^^^^^^^^↑複雑そうですがRange("D10").Select みたいな感じで、
文字列の指すセルを選択できます。
最後に、選択されたセルに、貼りつけています
> ActiveSheet.Paste 'コピーした図形を貼る
処理を行ってます。
なんか、回りくどいやりかたのような、、、
(*Ken3得意のできたからイイヤプログラム、、
Activeがあったり、無かったり行儀悪い、、、
動きゃいいってもんじゃないでしょ)
また、これは蛇足だ、、私ならこう処理する、、
この切り口は?
など、この例題処理?課題?のうまい調理法、思いついた人は、
気軽にご指摘・文句なんでも下さい。
*でも、チョコ画像はイリマセンよ、、、少しはうれしかったけど。
(今回は、かなり困った、、イジメられた、、BMPじゃなくてせめて
JpgかGifで下さいよ、、、)
今日の一言、、
今日も、マクロ記録+簡単なプロパティの紹介でまとめやがって、、
具体的に使える、
プロらしいテクニックないの?、、、(VBAソースの書き方汚いしねぇ)
やっぱ、三流だなぁ、、と声が聞こえてきたところで、このへんで、、
今日も逃げ出す、、、悪人 Ken3 でした。。。
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。 時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。 |
| ←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 ※種類が豊富で探し易い※在庫ありが48時間以内発送 |