義理チョコも、もらえなかった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時間以内発送 |