エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その84です。
キューバ屈指の外人向けリゾート地バラデロから、マタンザスを経由して、バスでハバナに向かいます。
バスの中はこんな感じ。
道路の中央分離帯に咲く花。
カリブ海の海 ヾ(´ー`)ノ
そして、マタンザスに到着。
駅前のバスロータリーにて。
そういえば、バスがマタンザスからハバナに向かうとき、しばらくの間iPhoneのカメラを回しっぱなしにして、動画を撮ったのだった。
機会を見て、どんな感じの街だったのかも紹介したいと思う。
塾長のキューバ旅行記、最初から読みたい方はこちらから
ちょっと前のブログで、以下のようなプログラムを紹介しました。
複数セルに値を入れる処理を高速化したい – Excelマクロ・VBA
複数セルでの処理を高速化したい-その2 Unionメソッドを使用する Excelマクロ・VBA
Sub KaihenCode3() Dim wsSche As Worksheet Dim dtTo As Date Dim cHiduke As Long Dim cName As Long dtTo = #1/1/2012# Set wsSche = Worksheets("スケジュール") Dim rB As Range Set rB = wsSche.Range("C13,C16,C19,C22,C25,C28,C31,C34,C37,C40,C43") '[*] Dim rTgt As Range '[a] Do While Month(dtTo) = 1 cHiduke = Day(dtTo) '入力月の日付を入力 wsSche.Range("C10").Offset(, cHiduke).Value = Day(dtTo) '曜日を入力 wsSche.Range("C11").Offset(, cHiduke).Value = WeekdayName(Weekday(dtTo), True) If Weekday(dtTo) = 1 Or Weekday(dtTo) = 7 Then '[b] If rTgt Is Nothing Then Set rTgt = rB.Offset(, cHiduke) Else Set rTgt = Union(rTgt, rB.Offset(, cHiduke)) End If '[c][/c] End If dtTo = DateAdd("d", 1, dtTo) Loop '[d] With rTgt .Value = "○" .Font.Size = 11 .Font.Bold = True .HorizontalAlignment = xlCenter End With End Sub
で、このとき、[*]にあるコード。
ちょっと解説します。
エクセルシート上の連続する複数のセルを指定するときの方法としてメジャーなのは、以下の方法。
Range("C3:F5").Select '[a]
あとは、以下をマスターしておけばいいかな。
Range(Range("C3"), Range("G8")).Select '[b]
「自分で書けるようになるため」という目的で言うと、あとは、とりあえず無視してもいいかと思います。
他にも、ネットを探すとマニアックな指定方法についていろいろ書いている人を見かけますが…。
まあ、たくさん知ったからといって、少なくとも、自分で書く分には、メリットがある訳でもないですし。
既存のプログラムのメンテナンスをするとき、人が書いたコードの中に他の書き方が出てきたら、それから興味があればネットで調べてみてください。
で。
あとは、「連続する複数のセル」を指定するとき、どう書くのか、というところなんですが。
Range("A1, C3, E5").Select '[c][/c]
で。
これ、分かりにくいですけど、引数はひとつです。
ダブルクオートの位置に注意です。
慣れないうちやりがちな失敗は、以下。
Range("A1", "C3", "E5").Select '[d]
↑これだと、そもそもRangeプロパティが、引数を最大2つしか取らないので、実行時エラーとなります。
(”A1″, “C3”, “E5” という3つの引数を受け取る形になっている)
ややこしいのは、「Rangeプロパティは、引数を最大2つしか取らない」とは書きましたが、それは逆に言うと、「2つまでなら取り得る」ということ。
そして、2つの引数の両方ともを文字列とした以下は、一応動作する、ということです。
Range(“A1”, “E5”).Select ‘[e]
↑実行してみると分かりますが、上記のプログラムは、セルA1~E5の範囲を選択します。
(詳しい説明は省略しますが、なぜかというと、Rangeプロパティの2つの引数には、「セル」または「セルを指定する文字列」をあてればよいから)
..ちょっと、脱線してしまった。
それで、「連続する複数のセルを指定するとき、どう書くのか」ということで、以下のコードの解説に戻るんですが。
Range("A1, C3, E5").Select '[c][/c]
こういうの、作るときは、自動記録をすると簡単です。
(というか、どう書けばよいのか記憶が曖昧だったら、自動記録してみるのがよい)
例えば、上記
のコードであれば、自動記録をしつつ以下の作業をすれば、用意に欲しいサンプルを取得できます。
[1] セルA1をクリック
[2] [Ctrl]キーを押しながら、セルC3をクリック
[3] [Ctrl]キーを押しながら、セルF5をクリック
まー、いつも言っていますが、「分からないことがあったら、自動記録を使いましょう!」ということです。
お知らせ:
人気のセミナー2つを、久しぶりに開催します。受講受付開始しました。ふるってご参加ください☆
「エクセルデータ分析7つの上級技」 (あと3名)
「エクセルデータ分析」は、ほとんどリピータの方だけで埋まってしまいまして、早くも、残席3つだけとなりました。
ではでは (^^)/~
1. 参考になります
最近の記事は、マクロを書く時に参考になるのが多いです。(^∇^)
ありがとうございます。
http://ameblo.jp/syuritakazuma/
2. Re:参考になります
>syuさん
ありがとうございます ヾ(´ー`)ノ
http://ameblo.jp/kanjizaibosatsu/
スゲー!よく知ってる人がいるもんだ!!