回答編集履歴

4

追記

2020/03/03 07:08

投稿

mattuwan
mattuwan

スコア2136

test CHANGED
@@ -529,3 +529,61 @@
529
529
 
530
530
 
531
531
  長くなりましたがRangeオブジェクトを理解するのに参考になれば幸いです。
532
+
533
+
534
+
535
+ ---
536
+
537
+ 追記
538
+
539
+
540
+
541
+ 一行で書くから分かり難いのかも?
542
+
543
+
544
+
545
+ ```ExcelVBA
546
+
547
+ Sub test4()
548
+
549
+ Dim ws As Worksheet
550
+
551
+
552
+
553
+ Dim rng As Range
554
+
555
+ Dim c As Range
556
+
557
+
558
+
559
+ Set ws = ActiveSheet
560
+
561
+ Set lst = ws.ListObjects.Item(1)
562
+
563
+ Set rng = lst.Range
564
+
565
+ Set c = rng.Item(5, 3)
566
+
567
+
568
+
569
+ MsgBox c.Address(False, False, xlA1, True)
570
+
571
+ End Sub
572
+
573
+ ```
574
+
575
+
576
+
577
+ 沢山の変数を用意するまでもないので、
578
+
579
+ 1行で書いているとも言えます。
580
+
581
+ > Dim lst As ListObject
582
+
583
+ > Set lst = ws.ListObjects.Item(1)
584
+
585
+ ListObjectが単数形だったり複数形だったりするのも違いを認識しておきましょう。
586
+
587
+
588
+
589
+ (も少し整理したら、入門書のコラムで使えそう。。。。。。な内容になってしまった^^;;)

3

追記

2020/03/03 07:08

投稿

mattuwan
mattuwan

スコア2136

test CHANGED
@@ -385,3 +385,147 @@
385
385
  こういう書き方が正解なんだろうなぁ。。。と今回こちらも勉強になりました。
386
386
 
387
387
  ちょっと、一旦休憩。
388
+
389
+
390
+
391
+ ---
392
+
393
+ 追記
394
+
395
+
396
+
397
+ > とりあえずrangeについての理解が全然足りてないので、そこから理解しようと試みました
398
+
399
+
400
+
401
+ Rangeとは何ぞやと、そこだけ追及すると混乱するかもです。
402
+
403
+ なぜなら、オブジェクトと呼ばれたりプロパティと呼ばれたりするからです。
404
+
405
+
406
+
407
+ なぜ、
408
+
409
+ 「オブジェクトとは」
410
+
411
+ 「プロパティとは」
412
+
413
+ ここを追求しないのでしょうか?
414
+
415
+
416
+
417
+ [【Excel VBA入門】オブジェクトとは?初心者向けに概念をやさしく解説!](https://valmore.work/excel-vba-object/)
418
+
419
+ [なかなか理解できなかったマクロ(Excel VBA)の「オブジェクト」について、セルの計算を例にあげて説明](https://my-tax-nology.com/excel-vba-the-meaning-of-object)
420
+
421
+
422
+
423
+ 僕がオブジェクトについて腑に落ちたのは変数にセル範囲を代入してみて、
424
+
425
+ ローカルウィンドウで中身を確認したときかなぁ。。。。
426
+
427
+
428
+
429
+ ```ExcelVBA
430
+
431
+ Sub test()
432
+
433
+ Dim c As Range
434
+
435
+
436
+
437
+ Set c = Range("C5:F12")
438
+
439
+ Stop
440
+
441
+ End Sub
442
+
443
+ ```
444
+
445
+ こんなこと書いて実行してみて、Stopで止まった時に、
446
+
447
+ ローカルウィンドウの+cの、「+」をクリックしたときかなぁ、、、、
448
+
449
+
450
+
451
+ あとは、
452
+
453
+ ```ExcelVBA
454
+
455
+ Sub test2()
456
+
457
+ Dim v
458
+
459
+
460
+
461
+ v = Range("C5:F12")
462
+
463
+ Set v = Range("C5:F12")
464
+
465
+ End Sub
466
+
467
+ ```
468
+
469
+ こんなコードをステップ実行してみて、
470
+
471
+ ローカルウィンドウのvの変化を確認してみたりするとわかるかと。。。。
472
+
473
+ ちなみにtest2のコードの省略されている部分を真面目に書くと以下のとおり。
474
+
475
+
476
+
477
+ ```ExcelVBA
478
+
479
+ Sub test3()
480
+
481
+ Dim v as Variant
482
+
483
+
484
+
485
+ Let v = ActiveSheet.Range("C5:F12").Value
486
+
487
+ Set v = ActiveSheet.Range("C5:F12").Cells
488
+
489
+ End Sub
490
+
491
+ ```
492
+
493
+
494
+
495
+ こんな説明で、Rangeオブジェクトのイメージがつかめないでしょうか?
496
+
497
+ で、最初に戻ると、
498
+
499
+
500
+
501
+ >activesheet.listobjects(1).range(5,3).select
502
+
503
+ これは、
504
+
505
+ activesheet.listobjects.item(1).range.item(5,3).select
506
+
507
+ の略であり、
508
+
509
+ 「アクティブシート上のテーブルの集まりのうちの一つ目のテーブルのセル範囲の5行目の3列目のセルを選択しなさい」
510
+
511
+ という意味の命令です。
512
+
513
+
514
+
515
+ たまたま、
516
+
517
+ リストオブジェクトのそのセル範囲を返すプロパティが「Range」と定義されていますが、
518
+
519
+ シート上のそのセル範囲を返すプロパティは、「Cells」であり、
520
+
521
+ シートのRangeプロパティは操作対象が違うので、同じ名前のプロパティでも、
522
+
523
+ 違う使い方になる可能性があるということです。
524
+
525
+ この辺はVBAを開発した人が定義しているので、
526
+
527
+ 使う側は受け入れるしかないです。
528
+
529
+
530
+
531
+ 長くなりましたがRangeオブジェクトを理解するのに参考になれば幸いです。

2

追記

2020/03/03 06:51

投稿

mattuwan
mattuwan

スコア2136

test CHANGED
@@ -303,3 +303,85 @@
303
303
  僕は「回答する」というところで勉強中です。
304
304
 
305
305
  (掲示板には課題がたくさんあって、経験値を積むには恰好の場所です。)
306
+
307
+
308
+
309
+ ---
310
+
311
+ ~~ヘルプより抜粋~~
312
+
313
+ > Excel 開発者用リファレンス
314
+
315
+ > Worksheet.Range プロパティ
316
+
317
+ > セルまたはセル範囲を表す Range オブジェクトを返します。
318
+
319
+ > 構文
320
+
321
+ >
322
+
323
+ > 式.Range(Cell1, Cell2)
324
+
325
+ >
326
+
327
+ > 式 Worksheet オブジェクトを表す変数。
328
+
329
+ >
330
+
331
+ > パラメーター
332
+
333
+ >
334
+
335
+ > 名前 必須/オプション データ型 説明
336
+
337
+ > Cell1 必須 バリアント型 (Variant) セル範囲の名前を指定します。これは、コード記述時の言語の A1 形式での範囲である必要があります。範囲名には、範囲を表す演算子 (:)、共通部分を表す演算子 (スペース) または複数の範囲を表す演算子 (,) を含めることができます。また、ドル記号 ($) は含めることはできますが、無視されます。範囲の一部にローカルに定義した名前を使用できます。名前を使用する場合、その名前はコード記述時の言語と見なされます。
338
+
339
+ > Cell2 オプション バリアント型 (Variant) セル範囲の左上隅と右下隅のセルを指定します。各引数には、単一のセル、列全体、または行全体を含む Range オブジェクト、あるいはコード記述時の言語で単一のセルの名前を示す文字列を指定できます。
340
+
341
+ ~~抜粋終わり~~
342
+
343
+
344
+
345
+ ワークシートオブジェクトのRangeプロパティは、引数の指定が必須です。
346
+
347
+ なので先の課題の回答としては、
348
+
349
+
350
+
351
+ >1)原因は何?
352
+
353
+ ActiveSheet.Range.Default(5, 3).Select
354
+
355
+ という意味ではないのです。
356
+
357
+ なので、
358
+
359
+ >「VBA 実行時エラー ’1004’ アプリケーション定義またはオブジェクト定義のエラーです」
360
+
361
+ は、引数の指定の仕方が間違っている=オブジェクト定義のエラー
362
+
363
+ となります。
364
+
365
+ 括弧の中は、セルのアドレスを示す文字か、Rangeオブジェクトを示す必要があります。
366
+
367
+
368
+
369
+ >2)どう書くのが正解?
370
+
371
+ Sub test3()
372
+
373
+ ActiveSheet.Range("A1")(5, 3).Select
374
+
375
+ End Sub
376
+
377
+
378
+
379
+ 今までの話の流れで行くとこうなります。
380
+
381
+ こういう書き方は、ネット上のサンプルでは見かけませんが、
382
+
383
+ ヘルプを読んで考察し、実際に実験をしてみると、
384
+
385
+ こういう書き方が正解なんだろうなぁ。。。と今回こちらも勉強になりました。
386
+
387
+ ちょっと、一旦休憩。

1

修正

2020/03/02 23:06

投稿

mattuwan
mattuwan

スコア2136

test CHANGED
@@ -238,20 +238,6 @@
238
238
 
239
239
 
240
240
 
241
- > は範囲の左上端のセルを返します。
242
-
243
- > Range.Item(2)
244
-
245
-
246
-
247
- ↑この説明は書き間違いですね^^;
248
-
249
- 左上は Range.Item(1)
250
-
251
- 1から始まりますので。。。。
252
-
253
-
254
-
255
241
  このようにして、ヘルプとオブジェクトブラウザを駆使して、
256
242
 
257
243
  プロパティやメソッドの利用の仕方を調べてプログラムを書いてきます。
@@ -270,6 +256,8 @@
270
256
 
271
257
  ヘルプをみてコードが書ければ、脱初心者と言えると思います。
272
258
 
259
+ とりあえず、ヘルプをいちいち確認する癖をつけてみましょう。
260
+
273
261
 
274
262
 
275
263
  [【Excel VBA】Rangeオブジェクトの既定のプロパティ…_Defaultプロパティ](https://officek.net/excelvba/v-range/vr-range/vrr-default/)