teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2020/03/03 07:08

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -263,4 +263,33 @@
263
263
  この辺はVBAを開発した人が定義しているので、
264
264
  使う側は受け入れるしかないです。
265
265
 
266
- 長くなりましたがRangeオブジェクトを理解するのに参考になれば幸いです。
266
+ 長くなりましたがRangeオブジェクトを理解するのに参考になれば幸いです。
267
+
268
+ ---
269
+ 追記
270
+
271
+ 一行で書くから分かり難いのかも?
272
+
273
+ ```ExcelVBA
274
+ Sub test4()
275
+ Dim ws As Worksheet
276
+
277
+ Dim rng As Range
278
+ Dim c As Range
279
+
280
+ Set ws = ActiveSheet
281
+ Set lst = ws.ListObjects.Item(1)
282
+ Set rng = lst.Range
283
+ Set c = rng.Item(5, 3)
284
+
285
+ MsgBox c.Address(False, False, xlA1, True)
286
+ End Sub
287
+ ```
288
+
289
+ 沢山の変数を用意するまでもないので、
290
+ 1行で書いているとも言えます。
291
+ > Dim lst As ListObject
292
+ > Set lst = ws.ListObjects.Item(1)
293
+ ListObjectが単数形だったり複数形だったりするのも違いを認識しておきましょう。
294
+
295
+ (も少し整理したら、入門書のコラムで使えそう。。。。。。な内容になってしまった^^;;)

3

追記

2020/03/03 07:08

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -191,4 +191,76 @@
191
191
  こういう書き方は、ネット上のサンプルでは見かけませんが、
192
192
  ヘルプを読んで考察し、実際に実験をしてみると、
193
193
  こういう書き方が正解なんだろうなぁ。。。と今回こちらも勉強になりました。
194
- ちょっと、一旦休憩。
194
+ ちょっと、一旦休憩。
195
+
196
+ ---
197
+ 追記
198
+
199
+ > とりあえずrangeについての理解が全然足りてないので、そこから理解しようと試みました
200
+
201
+ Rangeとは何ぞやと、そこだけ追及すると混乱するかもです。
202
+ なぜなら、オブジェクトと呼ばれたりプロパティと呼ばれたりするからです。
203
+
204
+ なぜ、
205
+ 「オブジェクトとは」
206
+ 「プロパティとは」
207
+ ここを追求しないのでしょうか?
208
+
209
+ [【Excel VBA入門】オブジェクトとは?初心者向けに概念をやさしく解説!](https://valmore.work/excel-vba-object/)
210
+ [なかなか理解できなかったマクロ(Excel VBA)の「オブジェクト」について、セルの計算を例にあげて説明](https://my-tax-nology.com/excel-vba-the-meaning-of-object)
211
+
212
+ 僕がオブジェクトについて腑に落ちたのは変数にセル範囲を代入してみて、
213
+ ローカルウィンドウで中身を確認したときかなぁ。。。。
214
+
215
+ ```ExcelVBA
216
+ Sub test()
217
+ Dim c As Range
218
+
219
+ Set c = Range("C5:F12")
220
+ Stop
221
+ End Sub
222
+ ```
223
+ こんなこと書いて実行してみて、Stopで止まった時に、
224
+ ローカルウィンドウの+cの、「+」をクリックしたときかなぁ、、、、
225
+
226
+ あとは、
227
+ ```ExcelVBA
228
+ Sub test2()
229
+ Dim v
230
+
231
+ v = Range("C5:F12")
232
+ Set v = Range("C5:F12")
233
+ End Sub
234
+ ```
235
+ こんなコードをステップ実行してみて、
236
+ ローカルウィンドウのvの変化を確認してみたりするとわかるかと。。。。
237
+ ちなみにtest2のコードの省略されている部分を真面目に書くと以下のとおり。
238
+
239
+ ```ExcelVBA
240
+ Sub test3()
241
+ Dim v as Variant
242
+
243
+ Let v = ActiveSheet.Range("C5:F12").Value
244
+ Set v = ActiveSheet.Range("C5:F12").Cells
245
+ End Sub
246
+ ```
247
+
248
+ こんな説明で、Rangeオブジェクトのイメージがつかめないでしょうか?
249
+ で、最初に戻ると、
250
+
251
+ >activesheet.listobjects(1).range(5,3).select
252
+ これは、
253
+ activesheet.listobjects.item(1).range.item(5,3).select
254
+ の略であり、
255
+ 「アクティブシート上のテーブルの集まりのうちの一つ目のテーブルのセル範囲の5行目の3列目のセルを選択しなさい」
256
+ という意味の命令です。
257
+
258
+ たまたま、
259
+ リストオブジェクトのそのセル範囲を返すプロパティが「Range」と定義されていますが、
260
+ シート上のそのセル範囲を返すプロパティは、「Cells」であり、
261
+ シートのRangeプロパティは操作対象が違うので、同じ名前のプロパティでも、
262
+ 違う使い方になる可能性があるということです。
263
+ この辺はVBAを開発した人が定義しているので、
264
+ 使う側は受け入れるしかないです。
265
+
266
+ 長くなりましたがRangeオブジェクトを理解するのに参考になれば幸いです。

2

追記

2020/03/03 06:51

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -150,4 +150,45 @@
150
150
 
151
151
  調べたことを自分の言葉で説明出来たら、「理解できた。」と言えると思うので、
152
152
  僕は「回答する」というところで勉強中です。
153
- (掲示板には課題がたくさんあって、経験値を積むには恰好の場所です。)
153
+ (掲示板には課題がたくさんあって、経験値を積むには恰好の場所です。)
154
+
155
+ ---
156
+ ~~ヘルプより抜粋~~
157
+ > Excel 開発者用リファレンス
158
+ > Worksheet.Range プロパティ
159
+ > セルまたはセル範囲を表す Range オブジェクトを返します。
160
+ > 構文
161
+ >
162
+ > 式.Range(Cell1, Cell2)
163
+ >
164
+ > 式 Worksheet オブジェクトを表す変数。
165
+ >
166
+ > パラメーター
167
+ >
168
+ > 名前 必須/オプション データ型 説明
169
+ > Cell1 必須 バリアント型 (Variant) セル範囲の名前を指定します。これは、コード記述時の言語の A1 形式での範囲である必要があります。範囲名には、範囲を表す演算子 (:)、共通部分を表す演算子 (スペース) または複数の範囲を表す演算子 (,) を含めることができます。また、ドル記号 ($) は含めることはできますが、無視されます。範囲の一部にローカルに定義した名前を使用できます。名前を使用する場合、その名前はコード記述時の言語と見なされます。
170
+ > Cell2 オプション バリアント型 (Variant) セル範囲の左上隅と右下隅のセルを指定します。各引数には、単一のセル、列全体、または行全体を含む Range オブジェクト、あるいはコード記述時の言語で単一のセルの名前を示す文字列を指定できます。
171
+ ~~抜粋終わり~~
172
+
173
+ ワークシートオブジェクトのRangeプロパティは、引数の指定が必須です。
174
+ なので先の課題の回答としては、
175
+
176
+ >1)原因は何?
177
+ ActiveSheet.Range.Default(5, 3).Select
178
+ という意味ではないのです。
179
+ なので、
180
+ >「VBA 実行時エラー ’1004’ アプリケーション定義またはオブジェクト定義のエラーです」
181
+ は、引数の指定の仕方が間違っている=オブジェクト定義のエラー
182
+ となります。
183
+ 括弧の中は、セルのアドレスを示す文字か、Rangeオブジェクトを示す必要があります。
184
+
185
+ >2)どう書くのが正解?
186
+ Sub test3()
187
+ ActiveSheet.Range("A1")(5, 3).Select
188
+ End Sub
189
+
190
+ 今までの話の流れで行くとこうなります。
191
+ こういう書き方は、ネット上のサンプルでは見かけませんが、
192
+ ヘルプを読んで考察し、実際に実験をしてみると、
193
+ こういう書き方が正解なんだろうなぁ。。。と今回こちらも勉強になりました。
194
+ ちょっと、一旦休憩。

1

修正

2020/03/02 23:06

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -118,13 +118,6 @@
118
118
  Cells
119
119
  など、複数形なのはその集まりを示すからです。
120
120
 
121
- > は範囲の左上端のセルを返します。
122
- > Range.Item(2)
123
-
124
- ↑この説明は書き間違いですね^^;
125
- 左上は Range.Item(1)
126
- 1から始まりますので。。。。
127
-
128
121
  このようにして、ヘルプとオブジェクトブラウザを駆使して、
129
122
  プロパティやメソッドの利用の仕方を調べてプログラムを書いてきます。
130
123
  入門書にはその辺のことが一切言及されていません。
@@ -134,6 +127,7 @@
134
127
  「開発者」への助けなので、初心者にとっては意味が解らないことが、
135
128
  書いてあります。
136
129
  ヘルプをみてコードが書ければ、脱初心者と言えると思います。
130
+ とりあえず、ヘルプをいちいち確認する癖をつけてみましょう。
137
131
 
138
132
  [【Excel VBA】Rangeオブジェクトの既定のプロパティ…_Defaultプロパティ](https://officek.net/excelvba/v-range/vr-range/vrr-default/)
139
133