
この練習問題では、エクセルの関数ではできない代入をイメージして作りました。配列変数を絶対に使わなくてはいけないわけじゃありませんが、こういう使い方をする。とイメージしてもらえればうれしいです。
配列変数は今後も使いどころが多いと思いますが、配列変数の細かい場所を示すというよりは、わかりやすいように頑張りたいと思います。
今回の要点をまとめてみた
- 書き換えはVBAの特権!関数ではできない
- 配列変数の使い方に触れてみる!イメージはエクセルのセル
- ループの順番について考えてみる(正直大差はない)
書き換えはVBAの特権!関数ではできない
関数で一番もどかしかったのは、書き換えができないことでした。VBAでは、すでに入力のある場所に書き込むこともできます。
また、複数の条件をいっぺんに検索できるというのも非常に良い点です。関数でIFを10個以上つなげて、いちいち計算されて全く使えないエクセルを作った経験は僕だけではないと思います。
配列変数の使い方に触れてみる!イメージはエクセルのセル
配列変数といわれるとちょっとイメージしづらいと思いますが、エクセルの縦を”列”、横を”行”を仮想で自分で決めて作れる。というのがイメージです。
ループの順番について考えてみる(正直どっちでも良いんだけど)
ループの方法は、結構面倒だなぁ~って思うのが順番ですね。
僕は、検索先にループを先に入れて、条件系をあとで回すようにしています。
やりたいことをまとめる
配列変数に条件を入れる→最終行を算出→最終行までのループを入れる→配列の要素数に応じて最後までループをさせる→もしも条件が一致したら、代入する
最終行の算出
最終行を算出するには、一番最後の行まで行ってから、ctr + ↑を使って埋めてあるセルを見つけるのが一番良いと思います。
For文について
ループの基本形は、下記に記述しております。
For ● = ▲ To ×
※この間は、▲から×の間ループをする
Next ●
そして、今回のコードは、このループを2回続けています。
IF文について
IF文は、関数をやっていたら、イメージ通りで大丈夫。
ただし、関数だと”=IF(条件式,正だった場合,偽であった場合)でパターンが分けられます。
IF 条件式 Then
※条件式が正だった場合に、ここのコードが読まれる。
End IF
という、正だった場合にのみ進むコードが一般的です。
初期設定を設置する意味
僕は、初期設定を入れるようにしました。できる限り、初期設定の中で変数を宣言し終わるのが目標でいつもやっています。
そうすると、次回以降の編集が非常に楽になる印象。いろいろなところで変数を代入してしまう癖があるので、固定で決めれるものは先に代入してしまう。
なぜ、書き換えられるのに横の列に書き込むのか?
念のため以外に今回はない。書き換えても良いものなら、僕は書き換えます。
実際のコードを示す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
Dim JoukenStr(1, 1 To 7) As Variant Dim StartRow1 As Integer Dim LastRow1 As Integer Dim ReadCol As Integer Dim WriteCol As Integer Private Sub 初期設定() '===条件と結果===== JoukenStr(0, 1) = 1 JoukenStr(1, 1) = "リンゴ" JoukenStr(0, 2) = 2 JoukenStr(1, 2) = "バナナ" JoukenStr(0, 3) = 3 JoukenStr(1, 3) = "パイナップル" JoukenStr(0, 4) = 4 JoukenStr(1, 4) = "イチゴ" JoukenStr(0, 5) = 5 JoukenStr(1, 5) = "オレンジ" JoukenStr(0, 6) = 6 JoukenStr(1, 6) = "マンゴー" JoukenStr(0, 7) = 7 JoukenStr(1, 7) = "キウイ" '================== StartRow1 = 3 '検索を開始する行を設定 ReadCol = 1 '判別材料の列 WriteCol = 2 '結果反映をさせる列 End Sub Public Sub 検索代入() Dim WS As Worksheet Dim looprun1 As Integer, looprun2 As Integer Dim HanteiStr As String Call 初期設定 Set WS = Worksheets("Sheet1") LastRow1 = WS.Cells(Rows.Count, 1).End(xlUp).Row For looprun1 = StartRow1 To LastRow1 HanteiStr = WS.Cells(looprun1, ReadCol).Value For looprun2 = LBound(JoukenStr, 2) To UBound(JoukenStr, 2) If HanteiStr = JoukenStr(0, looprun2) Then WS.Cells(looprun1, WriteCol).Value = JoukenStr(1, looprun2) End If Next looprun2 Next looprun1 End Sub |