質問編集履歴

2

追記

2020/05/12 11:33

投稿

vvvpp
vvvpp

スコア4

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,13 @@
1
+ ### まえがき
2
+
3
+
4
+
5
+ 文字数制限にひっかかってしまったため、**一部のコードを消去しました。**
6
+
7
+ 消去したコードにつきましては、**編集履歴** の方からご確認いただけます。
8
+
9
+
10
+
1
11
  ### 前提・実現したいこと
2
12
 
3
13
 
@@ -322,33 +332,301 @@
322
332
 
323
333
  ```VBA
324
334
 
325
- Private Sub TargetChart_MouseDown(ByVal Button As Long, ByVal Shift As Long _
326
-
327
- , ByVal x As Long, ByVal y As Long)
328
-
329
-
330
-
331
- Dim xlApp As Excel.Application: Set xlApp = GetObject(, "Excel.Application")
332
-
333
- Dim chart_ As Chart: Set chart_ = xlApp.ActiveChart
334
-
335
- Dim object_ As Object: Set object_ = chart_.Parent
336
-
337
- Dim long_ As Long: long_ = object_.Index
338
-
339
- Dim chartObject_ As ChartObject: Set chartObject_ = sheet_.ChartObjects(long_)
340
-
341
- Dim string_ As String: string_ = chartObject_.Name
342
-
343
- Debug.Print string_ ' エラー発生
344
-
345
- Set chartObject_ = Nothing
346
-
347
- Set object_ = Nothing
348
-
349
- Set chart_ = Nothing
350
-
351
- Set xlApp = Nothing
335
+ 編集履歴をご参照ください。
336
+
337
+ ```
338
+
339
+
340
+
341
+ **結果は変わらず、同じエラーが発生しました。**
342
+
343
+
344
+
345
+ 次に、【sheet_.ChartObjects(ActiveChart.Parent.Index).Name】
346
+
347
+ に原因があるのかを調べるため、次のコードを実行してみました。
348
+
349
+
350
+
351
+ ```VBA
352
+
353
+ 編集履歴をご参照ください。
354
+
355
+ ```
356
+
357
+
358
+
359
+ **結果は問題なし。**
360
+
361
+
362
+
363
+ 【sheet_.ChartObjects(ActiveChart.Parent.Index).Name】
364
+
365
+ でもエラーが発生しないということは、**【MouseDown イベント】に問題がある** と考え、
366
+
367
+ そちらに注目し、原因の追究をすることにしました。
368
+
369
+ (【試したこと(2)】に続きます)
370
+
371
+
372
+
373
+ ### 試したこと(2)
374
+
375
+
376
+
377
+ まずは、【MouseDown イベント】以外のイベントだとどうなるのか、
378
+
379
+ 検証してみました。
380
+
381
+
382
+
383
+ ただし、**【空のActiveChart】という前提** に合わないイベントは、
384
+
385
+ 検証するイベントから除いています。
386
+
387
+
388
+
389
+ 結果は次の通りです。
390
+
391
+
392
+
393
+ |イベント|Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name|Debug.Print ActiveChart.Parent.Name|
394
+
395
+ |:--:|:--:|:--:|
396
+
397
+ |MouseDown |エラー発生|問題なし|
398
+
399
+ |BeforeDoubleClick |エラー発生|問題なし|
400
+
401
+ |Activate |問題なし|問題なし|
402
+
403
+ |MouseMove |問題なし|問題なし|
404
+
405
+ |Resize |問題なし|問題なし|
406
+
407
+
408
+
409
+ 検証の結果、**【MouseDown イベント】だけではなく、**
410
+
411
+ **【BeforeDoubleClick イベント】でも同じエラーが発生する** ことを確認できました。
412
+
413
+
414
+
415
+ そこで、次は【BeforeDoubleClick イベント】から、次のコードを検証してみました。
416
+
417
+
418
+
419
+ ```VBA
420
+
421
+ 編集履歴をご参照ください。
422
+
423
+ ```
424
+
425
+ **結果は、【MouseDown イベント】と同様のエラーが発生しました。**
426
+
427
+ (【試したこと(3)】に続きます)
428
+
429
+
430
+
431
+ ### 試したこと(3)
432
+
433
+
434
+
435
+ Chart クリック → 適当なセルをクリック
436
+
437
+
438
+
439
+ というのを繰り返した結果、**エラーが発生しませんでした。**
440
+
441
+
442
+
443
+ これに注目し、**イベント間に何かしらの処理を挟んでみる** ことにしました。
444
+
445
+ 次は、検証用のコードとなります。
446
+
447
+
448
+
449
+ ```VBA
450
+
451
+ 編集履歴をご参照ください。
452
+
453
+ ```
454
+
455
+
456
+
457
+ 上記コードを実行し、Chart クリック → sheet_.Range("F2").Select
458
+
459
+
460
+
461
+ というのを繰り返した結果、**エラーが発生しませんでした。**
462
+
463
+
464
+
465
+ 検証を深めるため、上記コードを次のように変更してみました。
466
+
467
+
468
+
469
+ ```VBA
470
+
471
+ 編集履歴をご参照ください。
472
+
473
+ ```
474
+
475
+
476
+
477
+ 上記コードを実行し、Chart クリック → sheet_.Range("F2") = boolean_
478
+
479
+
480
+
481
+ というのを繰り返した結果、**エラーが発生しました。**
482
+
483
+ (【試したこと(4)】に続きます)
484
+
485
+
486
+
487
+ ### 試したこと(4)
488
+
489
+
490
+
491
+ 次に、Chart 1 クリック → Chart 2 クリック
492
+
493
+
494
+
495
+ というのを繰り返した結果、**エラーが発生しませんでした。**
496
+
497
+
498
+
499
+ ```VBA
500
+
501
+ 編集履歴をご参照ください。
502
+
503
+ ```
504
+
505
+
506
+
507
+ これに注目し、次のコードを検証してみました。
508
+
509
+
510
+
511
+ ```VBA
512
+
513
+ 編集履歴をご参照ください。
514
+
515
+ ```
516
+
517
+
518
+
519
+ 上記コードを実行し、
520
+
521
+ Chart 1 クリック → sheet_.ChartObjects("Chart 2").Chart.ChartArea.Select
522
+
523
+
524
+
525
+ というのを繰り返した結果、**エラーが発生しませんでした。**
526
+
527
+ (Chart 一つに使用できるメモリの量が決められていて、そのメモリが、
528
+
529
+ 【セル や 他のChart の Select】が行われるまで解放されない…ということでしょうか?)
530
+
531
+ (【試したこと(5)】に続きます)
532
+
533
+
534
+
535
+ ### 試したこと(5)
536
+
537
+
538
+
539
+ その他、次のことを試してみましたが、
540
+
541
+ **結果は変わらず、同じエラーが発生するだけでした。**
542
+
543
+
544
+
545
+ - 【ハードウェアグラフィックスアクセラレータを無効にする】を選択する
546
+
547
+ - 違う種類のChart(円・折れ線)を使用する
548
+
549
+ - book の修復
550
+
551
+ - アドイン の無効化
552
+
553
+ - Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name
554
+
555
+ を、Sub プロシージャ に移し、イベントから、そのプロシージャを呼び出すようにする
556
+
557
+ - **ステップイン実行**【イベント処理終了時(End Sub 到達後、[F8 キー]押下)、エラー発生】
558
+
559
+ (これにより、処理の終了前に次の処理が開始される → 処理が追いつかなくなってエラー
560
+
561
+ …という可能性もない、と考えてよさそうです。**正直、一番ありえそうな原因だったのですが…**)
562
+
563
+
564
+
565
+ 同様の症状について探していたところ、次の質問が見つかりました。
566
+
567
+ [Excel vba でメモリが不足しています。っと表示されて処理が完了できない。](https://teratail.com/questions/158078)
568
+
569
+
570
+
571
+ エラーメッセージ はドンピシャだったのですが…
572
+
573
+ 私は、【カメラ 機能】も【リンクされた図】も【数式】も【名前の定義】も
574
+
575
+ 使用(追加)していません。
576
+
577
+ (そもそも、Excelファイル新規作成 → 空のChartを挿入 → 上記ソースコード を記入
578
+
579
+ …しか行っていないファイルのため、肥大化とかはしていない…はずです。
580
+
581
+ 念のため、上の手順で同じファイルを作成してみましたが、何も変わりませんでした)
582
+
583
+
584
+
585
+ また、次の環境で試してみたところ、**エラーは発生しませんでした**。
586
+
587
+
588
+
589
+ Windows 7 Home Premium
590
+
591
+ メモリ:8.00 GB
592
+
593
+ Excel 2010 64bit(14.0.7237.5000)
594
+
595
+
596
+
597
+ ### 追記:試したこと(6)
598
+
599
+
600
+
601
+ sazi 様 からのご指摘を受け、次のコードの検証を行いました。
602
+
603
+
604
+
605
+ ```VBA
606
+
607
+
608
+
609
+ Public sheet_ As Worksheet
610
+
611
+ Public flag_ As Boolean
612
+
613
+ Private class_ As New TestChart
614
+
615
+ Private class2_ As New TestChart _
616
+
617
+
618
+
619
+ Sub Set_Data()
620
+
621
+
622
+
623
+ Set sheet_ = ThisWorkbook.Sheets("Main")
624
+
625
+ Set class_.TargetChart = sheet_.ChartObjects("グラフ 3").Chart
626
+
627
+ Set class2_.TargetChart = sheet_.ChartObjects("グラフ 1").Chart
628
+
629
+ flag_ = False
352
630
 
353
631
 
354
632
 
@@ -358,39 +636,41 @@
358
636
 
359
637
 
360
638
 
361
- **結果は変わらず、同じエラーが発生しました。**
362
-
363
-
364
-
365
- 次に、【sheet_.ChartObjects(ActiveChart.Parent.Index).Name】
366
-
367
- に原因があるのかを調べるため、次のコードを実行してみました。
368
-
369
-
370
-
371
- ```VBA
639
+ ```VBA
640
+
641
+
642
+
372
-
643
+ Private Sub TargetChart_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long,
644
+
645
+ ByVal Arg2 As Long, Cancel As Boolean)
646
+
647
+
648
+
373
- Sub test()
649
+ DoEvents
374
-
375
-
376
-
377
- Dim ii As Long
650
+
378
-
379
-
380
-
381
- sheet_.ChartObjects("Chart 1").Select
651
+
382
-
383
-
384
-
652
+
385
- For ii = 1 To 1000
653
+ If flag_ = False Then
386
654
 
387
655
 
388
656
 
389
- Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name ' 問題なし
657
+ flag_ = True
390
658
 
391
659
 
392
660
 
661
+ Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name ' エラー発生
662
+
663
+
664
+
665
+ flag_ = False
666
+
667
+
668
+
669
+ DoEvents
670
+
671
+
672
+
393
- Next ii
673
+ End If
394
674
 
395
675
 
396
676
 
@@ -398,409 +678,83 @@
398
678
 
399
679
  ```
400
680
 
401
-
402
-
403
- **結果は問題なし。**
404
-
405
-
406
-
407
- 【sheet_.ChartObjects(ActiveChart.Parent.Index).Name】
408
-
409
- でもエラー発生しないということは、**【MouseDown イベント】に問題ある** と考え、
410
-
411
- ちらに注目し原因の追究をするこにしした
412
-
413
- (【試したこと(2)】に続きます)
414
-
415
-
416
-
417
- ### 試したこと(2
418
-
419
-
420
-
421
- まずは、【MouseDown イベント】以外のイベントだどうなるのか、
422
-
423
- 検証してみました。
424
-
425
-
426
-
427
- ただし、**【空のActiveChart】という前提** に合わないイベントは、
428
-
429
- 検証するイベントから除いています。
430
-
431
-
432
-
433
- 結果は次通りです。
434
-
435
-
436
-
437
- |イベント|Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name|Debug.Print ActiveChart.Parent.Name|
438
-
439
- |:--:|:--:|:--:|
440
-
441
- |MouseDown |エラー発生|問題なし|
442
-
443
- |BeforeDoubleClick |エラー発生|問題なし|
444
-
445
- |Activate |問題なし|問題なし|
446
-
447
- |MouseMove |問題なし|問題なし|
448
-
449
- |Resize |問題なし|問題なし|
450
-
451
-
452
-
453
- 検証結果、**【MouseDown イベント】だけではなく、**
454
-
455
- **【BeforeDoubleClick イベント】でも同じエラーが発生する** ことを確認できました。
456
-
457
-
458
-
459
- そこで、次は【BeforeDoubleClick イベント】から、次のコードを検証してみました。
460
-
461
-
462
-
463
- ```VBA
464
-
465
- Private Sub TargetChart_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long,
466
-
467
- ByVal Arg2 As Long, Cancel As Boolean)
468
-
469
-
470
-
471
- Dim xlApp As Excel.Application: Set xlApp = GetObject(, "Excel.Application")
472
-
473
- Dim chart_ As Chart: Set chart_ = xlApp.ActiveChart
474
-
475
- Dim object_ As Object: Set object_ = chart_.Parent
476
-
477
- Dim long_ As Long: long_ = object_.Index
478
-
479
- Dim chartObject_ As ChartObject: Set chartObject_ = sheet_.ChartObjects(long_)
480
-
481
- Dim string_ As String: string_ = chartObject_.Name
482
-
483
- Debug.Print string_ ' エラー発生
484
-
485
- Set chartObject_ = Nothing
486
-
487
- Set object_ = Nothing
488
-
489
- Set chart_ = Nothing
490
-
491
- Set xlApp = Nothing
492
-
493
-
494
-
495
- End Sub
496
-
497
- ```
498
-
499
- **結果は、【MouseDown イベント】と同様のエラーが発生しました。**
500
-
501
- (【試したこと(3)】に続きます)
502
-
503
-
504
-
505
- ### 試したこと(3)
506
-
507
-
508
-
509
- Chart クリック → 適当なセルをクリック
510
-
511
-
512
-
513
- というのを繰り返した結果、**エラーが発生しませんでした。**
514
-
515
-
516
-
517
- これに注目し、**イベント間に何かしらの処理を挟んでみる** ことにしました。
518
-
519
- 次は、検証用のコードとなります。
520
-
521
-
522
-
523
- ```VBA
524
-
525
- Private nextTime As Date
526
-
527
-
528
-
529
- Sub test2()
530
-
531
-
532
-
533
- nextTime = DateAdd("s", 1, Now)
534
-
535
- Application.OnTime nextTime, "test2" ' 1秒ごとに処理する
536
-
537
-
538
-
539
- ' 処理
540
-
541
- sheet_.Range("F2").Select ' 問題なし
542
-
543
-
544
-
545
- End Sub
546
-
547
-
548
-
549
- Sub test2終了()
550
-
551
-
552
-
553
- On Error Resume Next
554
-
555
- Application.OnTime nextTime, "test2", , False
556
-
557
-
558
-
559
- End Sub
560
-
561
- ```
562
-
563
-
564
-
565
- 上記コードを実行し、Chart クリック → sheet_.Range("F2").Select
566
-
567
-
568
-
569
- というのを繰り返した結果、**エラーが発生しませんでした。**
570
-
571
-
572
-
573
- 検証を深めるため、上記コードを次のように変更してみました。
574
-
575
-
576
-
577
- ```VBA
578
-
579
- Private boolean_ As Boolean
580
-
581
- Private nextTime As Date
582
-
583
-
584
-
585
- Sub test2()
586
-
587
-
588
-
589
- nextTime = DateAdd("s", 1, Now)
590
-
591
- Application.OnTime nextTime, "test2" ' 1秒ごとに処理する
592
-
593
-
594
-
595
- ' 処理
596
-
597
- ' sheet_.Range("F2").Select ' 問題なし
598
-
599
- sheet_.Range("F2") = boolean_ ' エラー発生
600
-
601
- boolean_ = Not boolean_ ' 反転させる
602
-
603
-
604
-
605
- End Sub
606
-
607
-
608
-
609
- Sub test2終了()
610
-
611
-
612
-
613
- On Error Resume Next
614
-
615
- Application.OnTime nextTime, "test2", , False
616
-
617
-
618
-
619
- End Sub
620
-
621
- ```
622
-
623
-
624
-
625
- 上記コードを実行し、Chart クリック → sheet_.Range("F2") = boolean_
626
-
627
-
628
-
629
- というのを繰り返した結果、**エラーが発生しました。**
630
-
631
- (【試したこと(4)】に続きます)
632
-
633
-
634
-
635
- ### 試したこと(4)
636
-
637
-
638
-
639
- 次に、Chart 1 クリック → Chart 2 クリック
640
-
641
-
642
-
643
- というのを繰り返した結果、**エラーが発生しませんでした。**
644
-
645
-
646
-
647
- ```VBA
648
-
649
-
650
-
651
- Public sheet_ As Worksheet
652
-
653
- Private class_ As New TestChart
654
-
655
- Private class2_ As New TestChart
656
-
657
-
658
-
659
- Sub Set_Data()
660
-
661
-
662
-
663
- Set sheet_ = ThisWorkbook.Sheets("Main")
664
-
665
- Set class_.TargetChart = sheet_.ChartObjects("Chart 1").Chart
666
-
667
- Set class2_.TargetChart = sheet_.ChartObjects("Chart 2").Chart
668
-
669
-
670
-
671
- End Sub
672
-
673
- ```
674
-
675
-
676
-
677
- これに注目し、次のコードを検証してみました。
678
-
679
-
680
-
681
- ```VBA
682
-
683
- Private nextTime As Date
684
-
685
-
686
-
687
- Sub test2()
688
-
689
-
690
-
691
- nextTime = DateAdd("s", 1, Now)
692
-
693
- Application.OnTime nextTime, "test2" ' 1秒ごとに処理する
694
-
695
-
696
-
697
- ' 処理
698
-
699
- ' sheet_.Range("F2").Select ' 問題なし
700
-
701
- ' sheet_.Range("F2") = boolean_ ' エラー発生
702
-
703
- ' boolean_ = Not boolean_ ' 反転させる
704
-
705
- sheet_.ChartObjects("Chart 2").Chart.ChartArea.Select ' 問題なし
706
-
707
-
708
-
709
- End Sub
710
-
711
-
712
-
713
- Sub test2終了()
714
-
715
-
716
-
717
- On Error Resume Next
718
-
719
- Application.OnTime nextTime, "test2", , False
720
-
721
-
722
-
723
- End Sub
724
-
725
- ```
726
-
727
-
728
-
729
- 上記コードを実行し、
730
-
731
- Chart 1 クリック → sheet_.ChartObjects("Chart 2").Chart.ChartArea.Select
732
-
733
-
734
-
735
- というのを繰り返した結果、**エラーが発生しませんでした。**
736
-
737
- (Chart 一つに使用できるメモリの量が決められていて、そのメモリが、
738
-
739
- 【セル や 他のChart の Select】が行われるまで解放されない…ということでしょうか?)
740
-
741
- (【試したこと(5)】に続きます)
742
-
743
-
744
-
745
- ### 試したこと(5)
746
-
747
-
748
-
749
- その他、次のことを試してみましたが、
750
-
751
- **結果は変わらず、同じエラーが発生するだけでした。**
752
-
753
-
754
-
755
- - 【ハードウェアグラフィックスアクセラレータを無効にする】を選択する
756
-
757
- - 違う種類のChart(円・折れ線)を使用する
758
-
759
- - book の修復
760
-
761
- - アドイン の無効化
762
-
763
- - Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name
764
-
765
- を、Sub プロシージャ に移し、イベントから、そのプロシージャを呼び出すようにする
766
-
767
- - **ステップイン実行**【イベント処理終了時(End Sub 到達後、[F8 キー]押下)、エラー発生】
768
-
769
- (これにより、処理の終了前に次の処理が開始される → 処理が追いつかなくなってエラー
770
-
771
- …という可能性もない、と考えてよさそうです。**正直、一番ありえそうな原因だったのですが…**)
772
-
773
-
774
-
775
- 同様の症状について探していたところ、次の質問が見つかりました。
776
-
777
- [Excel vba でメモリが不足しています。っと表示されて処理が完了できない。](https://teratail.com/questions/158078)
778
-
779
-
780
-
781
- エラーメッセージ はドンピシャだったのですが…
782
-
783
- 私は、【カメラ 機能】も【リンクされた図】も【数式】も【名前の定義】も
784
-
785
- 使用(追加)していません。
786
-
787
- (そもそも、Excelファイル新規作成 → 空のChartを挿入 → 上記ソースコード を記入
788
-
789
- …しか行っていないファイルのため、肥大化とかはしていない…はずです。
790
-
791
- 念のため、上の手順で同じファイルを作成してみましたが、何も変わりませんでした)
792
-
793
-
794
-
795
- また、次の環境で試してみたところ、**エラーは発生しませんでした**。
796
-
797
-
798
-
799
- Windows 7 Home Premium
800
-
801
- メモリ:8.00 GB
802
-
803
- Excel 2010 64bit(14.0.7237.5000)
681
+ 検証の結果、**エラーが発生しました。**
682
+
683
+
684
+
685
+ ステップイン実行 でもエラーが発生していることもあり、
686
+
687
+ イベント処理中に他のイベントが邪魔をしている、のではなく、
688
+
689
+ イベント終了時の処理 のどこかに**【エラー発生の原因】**が
690
+
691
+ んでいるのではないか、と疑っており
692
+
693
+ (【試したこと(5)】のステップイン実行でも、
694
+
695
+  End Sub 到達後の[F8 キー]押下により、エラーが発生しています)
696
+
697
+ (【追記:試したこと(7】に続きます)
698
+
699
+
700
+
701
+ ### 追記:試したこ(7)
702
+
703
+
704
+
705
+ クリックに間をおくとどうなるか、検証してみました。
706
+
707
+
708
+
709
+ ・【 1 分 間隔 で Chart を クリック 】
710
+
711
+
712
+
713
+ |クリック回数|物理メモリ量|
714
+
715
+ |:--:|:--:|
716
+
717
+ |0|37,316 K|
718
+
719
+ |1|35,972 K|
720
+
721
+ |2|35,524 K|
722
+
723
+ |3|35,516 K|
724
+
725
+ |4(エラー発生)|34,348 K|
726
+
727
+
728
+
729
+ ・【 2 分 間隔 で Chart を クリック 】
730
+
731
+
732
+
733
+ |クリック回数|物理メモリ量|
734
+
735
+ |:--:|:--:|
736
+
737
+ |0|32,672 K|
738
+
739
+ |1|35,240 K|
740
+
741
+ |2|34,320 K|
742
+
743
+ |3|34,292 K|
744
+
745
+ |4|34,364 K|
746
+
747
+ |5|35,308 K|
748
+
749
+ |6(エラー発生)|33,344 K|
750
+
751
+
752
+
753
+ クリック間に時間をおいても、**エラーは発生しました。**
754
+
755
+ また、メモリの方もよくわからない結果になってしまいました。
756
+
757
+ メモリ不足のエラーの割に、メモリはあまり関係なかったりするのでしょうか?
804
758
 
805
759
 
806
760
 

1

【Markdown:表】の 修正

2020/05/12 11:33

投稿

vvvpp
vvvpp

スコア4

test CHANGED
File without changes
test CHANGED
@@ -246,7 +246,7 @@
246
246
 
247
247
  |クリック回数|物理メモリの量|
248
248
 
249
- |:--|:--:|
249
+ |:--:|:--:|
250
250
 
251
251
  |0|38,112 K|
252
252
 
@@ -436,7 +436,7 @@
436
436
 
437
437
  |イベント|Debug.Print sheet_.ChartObjects(ActiveChart.Parent.Index).Name|Debug.Print ActiveChart.Parent.Name|
438
438
 
439
- |:--|:--:|--:|
439
+ |:--:|:--:|:--:|
440
440
 
441
441
  |MouseDown |エラー発生|問題なし|
442
442