回答編集履歴

1

サンプルコードの追加

2017/01/17 00:55

投稿

rrryutaro
rrryutaro

スコア146

test CHANGED
@@ -64,28 +64,6 @@
64
64
 
65
65
  `LBound`は下限を返す関数です。
66
66
 
67
-
68
-
69
- 例えば次のように、配列のインデックスを指定できます。
70
-
71
- ```VBScript
72
-
73
- Sub Hoge()
74
-
75
- Dim v(2 To 4) As Variant
76
-
77
- Debug.Print (LBound(v)) //イミディエイトウィンドウに 2 が出力される
78
-
79
- Debug.Print (UBound(v)) // イミディエイトウィンドウに 4 が出力される
80
-
81
- End Sub
82
-
83
- ```
84
-
85
- このように、インデックスの範囲を指定した場合、インデックスの開始を0などで始めようとするとエラーとなるため、`LBound`、`UBound`を使います。
86
-
87
-
88
-
89
67
  `Bound`は境界。
90
68
 
91
69
  `LBound`の`L`はたぶんLowerで下を示すのでLower Boundで下限(下界?)。
@@ -93,3 +71,125 @@
93
71
  `UBound`の`U`はたぶんUpperで上を示すのでUpper Boundで上限(上界?)。
94
72
 
95
73
  という意味合いになるかと思います。
74
+
75
+
76
+
77
+ #追記:ついでなので、こんな書き方もありますという例です。
78
+
79
+ まず、Excelのシートは次のようにしています。
80
+
81
+ ![イメージ説明](e1ad2c5a6b99b537b9d980825e2f56ef.png)
82
+
83
+
84
+
85
+ コードは次の通りです。
86
+
87
+ ```VBScript
88
+
89
+ Sub Hoge()
90
+
91
+ On Error GoTo Err
92
+
93
+ Dim targetCells As Range
94
+
95
+ Dim readCell As Range
96
+
97
+ Dim writeCell As Range
98
+
99
+ Dim readArray As Variant
100
+
101
+ Dim writeArray As Variant
102
+
103
+ Dim i As Long, j As Long
104
+
105
+
106
+
107
+ Set targetCells = Range("F2", "F" & ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row)
108
+
109
+ Set writeCell = Range("T2")
110
+
111
+
112
+
113
+ Application.ScreenUpdating = False
114
+
115
+ For Each readCell In targetCells
116
+
117
+ ReDim writeArray(2)
118
+
119
+ readArray = Split(readCell, "x")
120
+
121
+ j = 2
122
+
123
+ For i = 0 To UBound(readArray)
124
+
125
+ writeArray(j) = readArray(i)
126
+
127
+ j = j - 1
128
+
129
+ Next
130
+
131
+ Range(writeCell, writeCell.Offset(, 2)) = writeArray
132
+
133
+ Set writeCell = writeCell.Offset(1)
134
+
135
+ Next
136
+
137
+ Err:
138
+
139
+ Application.ScreenUpdating = True
140
+
141
+ End Sub
142
+
143
+ ```
144
+
145
+ 実行結果は次のようになります。
146
+
147
+ ![イメージ説明](28de05754637acae36169e012bf8e136.png)
148
+
149
+
150
+
151
+
152
+
153
+ 逆にわかりづらくて混乱させるかもしれませんが、いくつか知って欲しいポイントがありますが、そんな方法もあるんだ程度に思ってください。
154
+
155
+
156
+
157
+ まず、セルの範囲を知る方法は色々とありますが、`UsedRange`があります。
158
+
159
+ この例では、`UsedRange`から、使われている最後の行の行番号を取得しています。
160
+
161
+ ただし、この方法は`F`列以外の列で`F`列以上のデータがあると正しい範囲を得られませんので、元々の方法である、`.End(xlUp)`で最後に入力のあるセルを得る方がよいかもしれません。
162
+
163
+
164
+
165
+ `ScreenUpdating`は、VBAを使い出した際に、大量データで処理が遅い時にかならずといっていいほど使う手段です。
166
+
167
+ `ScreenUpdating`が`False`だと画面の描画を一切更新しなくなります。`True`にすることで、通常通り更新されるようになります。つまり、セルへの書き込みなどを描画しないので速くなりますが、`True`にし忘れると、何も反応が無くなったようになり、戻し方が分からなければExcelを終了せざる終えなくなりますので、注意が必要です。
168
+
169
+
170
+
171
+ このため、`On Error Goto Err`として、エラーが発生した場合、`Err:`ラベルへジャンプするようにして、必ず`ScreenUpdating`をTrueにするようにしています。
172
+
173
+
174
+
175
+ 後は配列は`0 to 2`固定と考えて、書き込み用の配列を作成し、後ろから値を入れて、セル範囲に配列で書き込んでいます。
176
+
177
+
178
+
179
+ セルの操作は相対参照するようにしています。まず最初に`Set writeCell = Range("T2")`として書き込みするセルの開始点を設定します。
180
+
181
+
182
+
183
+ 値を貼り付ける時は、T~Vとなるように、`.Offset(, 2)`として、自身から2列離れたセルを参照させています。
184
+
185
+ 最後に、`.Offset(1)`としてひとつしたのセルへと設定しています。
186
+
187
+
188
+
189
+ この辺のセル操作はそれぞれに好みのやり方もあるかと思いますが、Excel VBAでもっとも重要といってもよいくらい`Range`オブジェクトは重要だと自分は考えています。
190
+
191
+
192
+
193
+ 以上
194
+
195
+