Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


55 / 13645 ツリー ←次へ | 前へ→

【82158】グラフのコピー あおこ 23/6/12(月) 15:00 質問[未読]
【82159】Re:グラフのコピー マナ 23/6/12(月) 22:36 発言[未読]
【82160】Re:グラフのコピー あおこ 23/6/13(火) 10:08 発言[未読]
【82161】Re:グラフのコピー マナ 23/6/13(火) 23:21 発言[未読]
【82162】Re:グラフのコピー あおこ 23/6/14(水) 16:31 質問[未読]
【82163】Re:グラフのコピー あおこ 23/6/14(水) 18:32 質問[未読]
【82164】Re:グラフのコピー マナ 23/6/14(水) 21:25 発言[未読]
【82165】Re:グラフのコピー あおこ 23/6/15(木) 14:33 お礼[未読]
【82166】ディメンションが無効 あおこ 23/6/15(木) 17:56 質問[未読]
【82167】Re:ディメンションが無効 マナ 23/6/15(木) 21:13 発言[未読]
【82168】Re:ディメンションが無効 あおこ 23/6/16(金) 10:58 お礼[未読]
【82169】Re:ディメンションが無効 マナ 23/6/16(金) 21:24 発言[未読]
【82170】Re:ディメンションが無効 あおこ 23/6/20(火) 10:22 お礼[未読]

【82158】グラフのコピー
質問  あおこ  - 23/6/12(月) 15:00 -

引用なし
パスワード
   いつも参考にさせていただきありがとうございます。


アンケートの集計結果を作成するマクロを組んでいます。

「クロス集計_割合」に、質問ごとにすべての学校分の集計があり、
指定した学校分のデータを抽出し、あらかじめ作成したグラフをコピーし、
「結果ひな形」の通知様式と組み合わせて作成しています。

指定校分のデータ抽出は、「クロス集計_割合」を複写後、指定校以外のデータ行を削除し行っています。
データ作成後、質問ごとに順に範囲を選択し「基本グラフ」にあるグラフをコピーし、データソースを変更し作成しています。
今回のアンケートは9問あるため、グラフは1シートに9個コピーされます。

下のようにコードを書いていますが、ブレークポイントを入れて少しずつ実行した場合、きちんと作成されるのですが、一気に処理すると、時々固まって落ちます。(3〜4回に1回応答なしになって落ちます。)


下記のうち、グラフをコピーする部分を丸ごと削除すると、数回試しても落ちることはなかったので、グラフのコピー箇所に問題があるのだろうと思いますが、改善方法がよくわかりません。
ご指摘、もしくはヒントでもいただけると幸いです。

よろしくお願いいたします。


Sub 指定校結果作成()

 Set wb_A = ThisWorkbook
 Set sh_A1 = wb_A.Worksheets("作業用")
 Set sh_A2 = wb_A.Worksheets("クロス集計_割合")
 Set sh_A3 = wb_A.Worksheets("基本グラフ")
 Set sh_A4 = wb_A.Worksheets("結果ひな形")
  gakko = sh_A1.Range("I14")
 
  MsgBox gakko & "分の結果を作成します", vbInformation
 
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  gakko = Left(gakko, InStr(gakko, "中"))
 
 '’学校名シートがないか確認して追加、あれば削除するコードを記述(記載省略)
 ‘追加したシート名をgakkoに変更するコードを記述(記載省略)  
  
  Set sh_A5 = wb_A.Worksheets(gakko)
  With sh_A5
   sh_A2.UsedRange.Copy
   .Activate
   .Range("A2").Select
   Selection.PasteSpecial Paste:=xlPasteAll
   Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピーします。>
   Application.CutCopyMode = False
  
  ‘学校名からコードg_codeを参照する処理を記述(記載省略)

   lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
   '’不要行削除
   For GYO = lastRow1 To 2 Step -1
   If Left(.Cells(GYO, 1), 2) <> "質問" And .Cells(GYO, 1) <> "合計" And .Cells(GYO, 1) <> g_code Then ‘指定校・質問行・合計行以外のデータを削除
    .Range(GYO & ":" & GYO).Delete
   End If
   Next GYO
 
  
   lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
   '質問番号追加および0値クリア
   For GYO = 2 To lastRow1
    If Left(.Cells(GYO, 1), 2) = "質問" Then
      .Cells(GYO, 2) = Right(.Cells(GYO, 1), 1) & " " & .Cells(GYO, 2)
    Else
    '0値クリア
      lastcol1 = .Cells(GYO, Columns.Count).End(xlToLeft).Column '読み込み行の最終列を取得
      For RETSU = 3 To lastcol1
        If .Cells(GYO, RETSU) = 0 Then
          .Cells(GYO, RETSU) = ""
        End If
      Next RETSU
    End If
   Next GYO
  ''ここまででグラフ元データ完成
  '=========================================
  ''データを基にグラフを作成
  lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
  GYO = 2 '開始行
  G = 0
  Do While .Cells(GYO, 1).Value <> ""
   .Activate
  
  '=========================================
  '質問ごとのデータ範囲を選択
   GYO1 = GYO ' グループの先頭行→GYO1
   GYO = GYO + 1
    ' 次の行から同じグループでない行を見つける
    Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
      GYO = GYO + 1
    Loop
   GYO2 = GYO  ' 同じグループの最終行→GYO2
   GYO = GYO + 1
   G = G + 1 '設問数をカウント
   lastcol1 = .Cells(GYO1, Columns.Count).End(xlToLeft).Column '読み込み行の最終列を取得
   .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1)).Select
    
   Set R = Selection.Item(1)
   Set S = Selection
  '=========================================

   If G = 1 Then '1つめのグラフの位置(行)
    G_GYO = 17
   Else
    G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 'グラフの右下のセルの行
   End If
    'sh_A3.ChartObjects(1).Copy.Range ("A1")
    sh_A3.ChartObjects(1).Copy
    DoEvents
    
    .Activate
    .Range("A1").Select
    .Paste
    Application.CutCopyMode = False
    .ChartObjects(.ChartObjects.Count).Left = .Range("K" & G_GYO).Left
    .ChartObjects(.ChartObjects.Count).Top = .Range("K" & G_GYO).Top
    .ChartObjects(.ChartObjects.Count).Chart.SetSourceData Source:=S '選択範囲をデータソースに
    .ChartObjects(.ChartObjects.Count).Chart.ChartTitle.Text = R.Value
    .ChartObjects(.ChartObjects.Count).Height = .Range("A1:A15").Height
    .ChartObjects(.ChartObjects.Count).Width = .Range("K1:S1").Width
   Loop
  
   G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 'グラフの右下のセルの行
  
   ''結果ひな形をコピー
   sh_A4.UsedRange.Copy
   .Activate
   .Range("K2").Select
   Selection.PasteSpecial Paste:=xlPasteAll
   'Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピーします。>
   Application.PrintCommunication = False '//プリンタとの接続を切断
   '印刷範囲設定 及び横1ページに収める
   .PageSetup.PrintArea = .Range(.Cells(1, 10), .Cells(G_GYO, 20)).Address
   .PageSetup.Zoom = False
   .PageSetup.FitToPagesWide = 1
   .PageSetup.FitToPagesTall = False
   Application.PrintCommunication = True '//プリンタと再接続
  End With 'sh_A5
  
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  
  MsgBox gakko & "分を作成しました", vbInformation

End Sub

【82159】Re:グラフのコピー
発言  マナ  - 23/6/12(月) 22:36 -

引用なし
パスワード
   ▼あおこ さん:

>下記のうち、グラフをコピーする部分を丸ごと削除すると、数回試しても落ちることはなかったので、グラフのコピー箇所に問題があるのだろうと思いますが、改善方法がよくわかりません。

「グラフをコピーする部分を丸ごと」とは、どこでしょうか?

【82160】Re:グラフのコピー
発言  あおこ  - 23/6/13(火) 10:08 -

引用なし
パスワード
   ▼マナ さん:
>▼あおこ さん:
>
>>下記のうち、グラフをコピーする部分を丸ごと削除すると、数回試しても落ちることはなかったので、グラフのコピー箇所に問題があるのだろうと思いますが、改善方法がよくわかりません。
>
>「グラフをコピーする部分を丸ごと」とは、どこでしょうか?

御覧いただきありがとうございます。


グラフをコピーするところまで残して、以下の、貼り付けてサイズを設定するコードを削除しています。
コピーまるごとではないですね(^^;)
きちんとお示しできていなくて申し訳ありません。

.Paste
Application.CutCopyMode = False
.ChartObjects(.ChartObjects.Count).Left = .Range("K" & G_GYO).Left
.ChartObjects(.ChartObjects.Count).Top = .Range("K" & G_GYO).Top
.ChartObjects(.ChartObjects.Count).Chart.SetSourceData Source:=S '選択範囲をデータソースに
.ChartObjects(.ChartObjects.Count).Chart.ChartTitle.Text = R.Value
.ChartObjects(.ChartObjects.Count).Height = .Range("A1:A15").Height
.ChartObjects(.ChartObjects.Count).Width = .Range("K1:S1").Width


それと グラフがないので、グラフの右下位置を取得する下記の式2か所も
G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 
G_GYO = 17 
に変更しています。

【82161】Re:グラフのコピー
発言  マナ  - 23/6/13(火) 23:21 -

引用なし
パスワード
   ▼あおこ さん:

こんな感じで書き直すとどうなりますか?
Sheet1のグラフ雛形を繰り返しSheet2にコピーする例です。

Sub test()
  Dim cho As ChartObject
  Dim k As Long
  Dim H As Double, W As Double
  
  Set cho = Sheet1.ChartObjects(1)
  H = Sheet2.Range("A1:A15").Height
  W = Sheet2.Range("K1:S1").Width
  
  Do
    cho.Copy
    Sheet2.Paste Sheet2.Range("k17").Offset(k * 17)
    With Sheet2.ChartObjects(k + 1)
'      .Chart.SetSourceData Source:=R
'      .Chart.ChartTitle.Text = R(1).Value
      .Height = H
      .Width = W
    End With
    k = k + 1
  Loop Until k > 5
  
End Sub

【82162】Re:グラフのコピー
質問  あおこ  - 23/6/14(水) 16:31 -

引用なし
パスワード
   ▼マナ さん:
>▼あおこ さん:
>
>こんな感じで書き直すとどうなりますか?
>Sheet1のグラフ雛形を繰り返しSheet2にコピーする例です。

ご回答ありがとうございます。
ご提示のコードを試させていただきました。
(少し変更しています。)

Sheet2.Paste Sheet2.Range("k17").Offset(k * 17)のところで
実行時エラー1004「WorksheetクラスのPasteメソッドが失敗しました」
のエラーで処理が止まりますので
DoEvents も書き足しました。(ネットで見つけた解決法です。あまり良くないでしょうか?)

Sub test()
  Dim cho As ChartObject
  Dim k As Long
  Dim H As Double, W As Double
  
  Set sh_A2 = Worksheets("学校")
  
  Set cho = Worksheets("基本グラフ").ChartObjects(1)
  H = sh_A2.Range("A1:A15").Height
  W = sh_A2.Range("K1:S1").Width
  k=0

  Do
    cho.Copy
    sh_A2.Activate
    DoEvents
    sh_A2.Paste sh_A2.Range("k17").Offset(k * 17)
    With sh_A2.ChartObjects(k + 1)
'      .Chart.SetSourceData Source:=R
'      .Chart.ChartTitle.Text = R(1).Value
      .Height = H
      .Width = W
    End With
    k = k + 1
  Loop Until k > 8
  
End Sub

上記コードで、今回のアンケートの質問数9個のグラフが問題なくコピーされ、繰り返し試しても落ちることはありませんでしたので、下記のように全体のコードを変更してみました。
変更後、15回ほど繰り返して処理を行いましたが、今のところ大丈夫のようです。

ありがとうございました!

ちなみに、他でも使えるように、できれば、グラフ終端を取得して次のグラフの位置決めをしたいのですが、当初こちらが記載していたコード(↓)だと動きが遅いんでしょうか?

G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 'グラフの右下のセルの行
でグラフコピーの都度セル位置を取得

最初、その部分を残してコードを走らせたら、けっこうな確率で「応答なし」となり落ちました。。

ご提示いただいた .Paste .Range("k17").Offset(k * 17)の、「17」を都度変えていく方が無難でしょうか?

もしよろしければ、ご教示願えると幸いです。


Sub テスト指定校結果作成()

 Set wb_A = ThisWorkbook
 Set sh_A1 = wb_A.Worksheets("作業用")
 Set sh_A2 = wb_A.Worksheets("クロス集計_割合")
 Set sh_A3 = wb_A.Worksheets("基本グラフ")
 Set sh_A4 = wb_A.Worksheets("結果ひな形")
 
 
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  gakko = sh_A1.Range("I14")
 
  '’学校名シートがないか確認して追加、あれば削除するコードを記述(記載省略)
 
 '=======================================================================
  Set sh_A5 = wb_A.Worksheets(gakko)
  With sh_A5
   sh_A2.UsedRange.Copy
   .Activate
   .Range("A2").Select
   Selection.PasteSpecial Paste:=xlPasteAll
   Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピー>
   Application.CutCopyMode = False
  
   lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
   .Rows("2:" & lastRow1).Select 'フォント変更
   Selection.Font.Size = 10
   Selection.Font.Name = "MS Pゴシック"
   Selection.VerticalAlignment = xlCenter
   .Rows("2:200").RowHeight = 15
   ' Selection.HorizontalAlignment = xlCenter
   ActiveWindow.Zoom = 80 '<アクティブシートの表示を80%にします。>


‘学校名からコードg_codeを参照する処理を記述(記載省略)
lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row

'’不要行削除
   For GYO = lastRow1 To 2 Step -1
   If Left(.Cells(GYO, 1), 2) <> "質問" And .Cells(GYO, 1) <> "合計" And .Cells(GYO, 1) <> g_code Then
    .Range(GYO & ":" & GYO).Delete
   End If
   Next GYO
  
  
   lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
   '質問番号追加及び0値クリア
   For GYO = 2 To lastRow1
    If Left(.Cells(GYO, 1), 2) = "質問" Then
      .Cells(GYO, 2) = Right(.Cells(GYO, 1), 1) & " " & .Cells(GYO, 2)
    Else
      lastcol1 = .Cells(GYO, Columns.Count).End(xlToLeft).Column '最終列を取得
      For RETSU = 3 To lastcol1
        If .Cells(GYO, RETSU) = 0 Then
          .Cells(GYO, RETSU) = ""
        End If
      Next RETSU
    End If
   Next GYO
     
   'ウィンドウ枠の固定
   .Range("C1").Select
   ActiveWindow.FreezePanes = True
   .Range("A1").Select
  
  ''元データ完成
  '=========================================
  ''データを基にグラフを作成
   Set cho = sh_A3.ChartObjects(1) 'コピー元のグラフ
   H = .Range("A1:A15").Height 'グラフの高さ
   W = .Range("K1:S1").Width 'グラフの幅
   k = 0’グラフの数の変数
  
  lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
  GYO = 2 '開始行
   
  Do While .Cells(GYO, 1).Value <> ""
   .Activate
  
  '=========================================
  '質問ごとのデータ範囲を選択
   GYO1 = GYO ' グループの先頭行→GYO1
   GYO = GYO + 1
    ' 次の行から同じグループでない行を見つける
    Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
      GYO = GYO + 1
    Loop
   GYO2 = GYO  ' 同じグループの最終行→GYO2
   GYO = GYO + 1
  
   lastcol1 = .Cells(GYO1, Columns.Count).End(xlToLeft).Column '最終列を取得
   .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1)).Select
    
   Set R = Selection
   
  '=========================================
  'グラフ作成
  
    cho.Copy
    DoEvents
    .Paste .Range("k17").Offset(k * 17)
    With .ChartObjects(k + 1)
      .Chart.SetSourceData Source:=R
      .Chart.ChartTitle.Text = R(1).Value
      .Height = H
      .Width = W
    End With
    k = k + 1
  Loop

  'グラフ作成終了
  '=========================================

   G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 'グラフの右下のセルの行
  
   ''結果ひな形をコピー
   sh_A4.UsedRange.Copy
   .Activate
   .Range("K2").Select
  
   Selection.PasteSpecial Paste:=xlPasteAll
   'Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピーします。>
   Application.PrintCommunication = False '//プリンタとの接続を切断
   '印刷範囲設定 及び横1ページに収める
   .PageSetup.PrintArea = .Range(.Cells(1, 10), .Cells(G_GYO, 20)).Address
   .PageSetup.Zoom = False
   .PageSetup.FitToPagesWide = 1
   .PageSetup.FitToPagesTall = False
   Application.PrintCommunication = True '//プリンタと再接続
  End With 'sh_A5
  
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  
  MsgBox gakko & "分を作成しました", vbInformation

End Sub

【82163】Re:グラフのコピー
質問  あおこ  - 23/6/14(水) 18:32 -

引用なし
パスワード
   ▼マナ さん:

何度も申し訳ありません。

さきほど「変更後、15回ほど繰り返して処理を行いましたが、今のところ大丈夫のようです。」と記載しましたが、


cho.Copy
DoEvents
.Paste .Range("k17").Offset(k * 17) ←

←の箇所で

まれに実行時エラー1004「WorksheetクラスのPasteメソッドが失敗しました」が出ることがあります。
そのまま再実行すれば貼り付けできるのですが。。

「Pasteメソッド 失敗」で検索し、「Pasteメソッドでエラーが発生する原因はクリップボードを使うからで、対策としてクリップボードを使用しないコピー方法が提示されていましたが、
Copyメソッドはグラフオブジェクトではサポートされていないとのことで、
実際
Range("A1").Copy Destination:= .Range("k17").Offset(k * 17)
を試しましたが、
実行時エラー1004「アプリケーション定義またはオブジェクト定義のエラーです」となりました。

何か良い方法がありますでしょうか。ご教示いただけると幸いです。

【82164】Re:グラフのコピー
発言  マナ  - 23/6/14(水) 21:25 -

引用なし
パスワード
   ▼あおこ さん:

>実行時エラー1004「WorksheetクラスのPasteメソッドが失敗しました」が出る

DoEventsの回数を増やしてください

Sub test2()
  Dim cho As ChartObject
  Dim d As Double
  Dim k As Long
  Dim r As Range
  
  On Error Resume Next
  Sheet2.ChartObjects.Delete
  On Error GoTo 0
  
  Set cho = Sheet1.ChartObjects(1).Duplicate.Parent
  With Sheet2.Range("A1:A15")
    cho.Height = .Height
    d = .Rows.Count + 2
  End With
  cho.Width = Sheet2.Range("K1:S1").Width
'
  Do
    Set r = Sheet2.Range("A1:B6")
    cho.Copy
    DoEvents
    DoEvents
    DoEvents
    Sheet2.Paste Sheet2.Range("k17").Offset(k * d)

    With Sheet2.ChartObjects(k + 1).Chart
      .SetSourceData Source:=r
      .ChartTitle.Text = r(1).Value
    End With
    k = k + 1
  Loop Until k > 5
  
  cho.Delete

End Sub

【82165】Re:グラフのコピー
お礼  あおこ  - 23/6/15(木) 14:33 -

引用なし
パスワード
   ▼マナ さん:

ご提示のコードを試したところ、快適に作成できました。
無事に目的の物が作成できそうです。
また分からなかったら質問させてください。

本当にありがとうございました。

【82166】ディメンションが無効
質問  あおこ  - 23/6/15(木) 17:56 -

引用なし
パスワード
   ▼マナ さん:
何度も申し訳ありません。
追加で質問です。

ご提示のコードを参考に下記のようにコードを書いて実行しています。

当初問題なく動いていたのですが、突然
 cho.Copy のところで
「指定したディメンションは、このグラフの種類では無効です。」
のエラーが出るようになりました。(再実行すれば作成されますし、出ないときもあります。)
解消方法がありますでしょうか。ネットで調べましたが、よく分かりませんでした。。

それから、下記のコードでは、まれに応答なしになって落ちるため、
ステータスバーにグラフの個数を表示させ、
何個目のグラフで落ちるのか確認していたら、
どうも最後のグラフが作成されるまでは行くので、
そのあとループがうまく抜けられないのかと。。

コードの問題点等あればご指摘いただけませんでしょうか。

今は
1.結果用シートを学校名で作成
2.結果用シートにクロス集計_割合シートの集計データをコピー
3.基本グラフのグラフをコピーして
4.結果用シートに貼り付け、データソースを変更
 ※質問数繰り返し
5.結果通知ひな形のデータを結果シートのグラフ上部に貼り付け、完成。
の手順で行っていますが、

うまくいかないのは、手順がよろしくないからでしょうか??
ネットや本で調べながらいろんなものを組み合わせて
見よう見まねで書いていますので、ご教示いただけるとありがたいです。

よろしくお願いいたします。


Sub 結果作成()

 Set wb_A = ThisWorkbook
 Set sh_A1 = wb_A.Worksheets("作業用")
 Set sh_A2 = wb_A.Worksheets("クロス集計_割合")
 Set sh_A3 = wb_A.Worksheets("基本グラフ")
 Set sh_A4 = wb_A.Worksheets("結果ひな形")
 
  gakko = sh_A1.Range("I10") & "学校"

  MsgBox "結果を作成します", vbInformation
    
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
  
  '’学校名シートがないか確認して追加、あれば削除するコードを記述(記載省略)
  
  Set sh_A5 = wb_A.Worksheets(gakko)
  With sh_A5
   sh_A2.UsedRange.Copy
   .Activate
   .Range("A2").Select
   Selection.PasteSpecial Paste:=xlPasteAll
   Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピーします。>
   Application.CutCopyMode = False
   lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
   .Rows("2:" & lastRow1).Select 'フォント変更
   Selection.Font.Size = 10
   Selection.Font.Name = "MS Pゴシック"
   Selection.VerticalAlignment = xlCenter
   
   ' Selection.HorizontalAlignment = xlCenter
   ActiveWindow.Zoom = 80 '<アクティブシートの表示を80%にします。>
  
   .Columns("J").ColumnWidth = 2
   .Columns("T").ColumnWidth = 1
   .Rows("2:200").RowHeight = 15
      
   'ウィンドウ枠の固定
   .Range("C1").Select
   ActiveWindow.FreezePanes = True
   .Range("A1").Select
  
  ''元データ完成
  '=========================================
  ''データを基にグラフを作成
  Set cho = sh_A3.ChartObjects(1).Duplicate.Parent 'コピー元のグラフを複製
  With sh_A5.Range("A1:A20")
    cho.Height = .Height
    d = .Rows.Count + 2
  End With
  cho.Width = .Range("K1:S1").Width
  cho.Copy   ←←ここ
   
  lastRow1 = .Range("A" & Rows.Count).End(xlUp).Row
  GYO = 2 '開始行
  k = 0 'グラフの個数
  
  Do While .Cells(GYO, 1).Value <> ""
   .Activate
   Application.StatusBar = "  " & k + 1 & "個めのグラフ処理・・"
  '=========================================
  '質問ごとのデータ範囲を選択
   GYO1 = GYO ' グループの先頭行→GYO1
   GYO = GYO + 1
    ' 次の行から同じグループでない行を見つける
    Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
      GYO = GYO + 1
    Loop
   GYO2 = GYO  ' 同じグループの最終行→GYO2
   GYO = GYO + 1
  
   lastcol1 = .Cells(GYO1, Columns.Count).End(xlToLeft).Column '読み込み行の最終列を取得
   .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1)).Select
    
    Set r = Selection

  '=========================================
   
   DoEvents
   DoEvents
   DoEvents
   DoEvents
   
    .Paste .Range("k17").Offset(k * d)
      
    .ChartObjects(k + 1).Chart.SetSourceData Source:=r
    .ChartObjects(k + 1).Chart.ChartTitle.Text = r(1).Value
   
   k = k + 1
   Loop
   cho.Delete
   Application.CutCopyMode = False
   Application.StatusBar = False
   
   'グラフ作成終了
   '=========================================
   G_GYO = .ChartObjects(.ChartObjects.Count).BottomRightCell.Row + 2 'グラフの右下のセルの行
  
   ''結果ひな形をコピー
   sh_A4.UsedRange.Copy
   .Activate
   .Range("K2").Select
   Selection.PasteSpecial Paste:=xlPasteAll
   'Selection.PasteSpecial Paste:=xlPasteColumnWidths '<書式(列幅)もコピーします。>
   Application.CutCopyMode = False
  
   Application.PrintCommunication = False '//プリンタとの接続を切断
   '印刷範囲設定 及び横1ページに収める
   .PageSetup.PrintArea = .Range(.Cells(1, 10), .Cells(G_GYO, 20)).Address
   .PageSetup.Zoom = False
   .PageSetup.FitToPagesWide = 1
   .PageSetup.FitToPagesTall = False
   Application.PrintCommunication = True '//プリンタと再接続
  End With 'sh_A5
  
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  MsgBox gakko & "分を作成しました", vbInformation

End Sub

【82167】Re:ディメンションが無効
発言  マナ  - 23/6/15(木) 21:13 -

引用なし
パスワード
   ▼あおこ さん:

>当初問題なく動いていたのですが、突然
> cho.Copy のところで
>「指定したディメンションは、このグラフの種類では無効です。」
>のエラーが出るようになりました。(再実行すれば作成されますし、出ないときもあります。)

>  Set cho = sh_A3.ChartObjects(1).Duplicate.Parent 'コピー元のグラフを複製

DoEventsをこの次に移動あるいは追加してみてはどうでしょうか。


>
>それから、下記のコードでは、まれに応答なしになって落ちるため、

同じデータで、応答なしになるのでしょうか。


>ステータスバーにグラフの個数を表示させ、
>何個目のグラフで落ちるのか確認していたら、
>どうも最後のグラフが作成されるまでは行くので、
>そのあとループがうまく抜けられないのかと。。

グラフの個数でなく、GYOを確認してみてはどうでしょうか。


>コードの問題点等あればご指摘いただけませんでしょうか。

>   GYO1 = GYO ' グループの先頭行→GYO1
>   GYO = GYO + 1    ←この行は必要でしょうか?


>   .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1)).Select  
>    Set r = Selection

ここはSelectしないで、1行にまとめてはどうでしょうか
Set r = .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1))

【82168】Re:ディメンションが無効
お礼  あおこ  - 23/6/16(金) 10:58 -

引用なし
パスワード
   ▼マナ さん:
>>当初問題なく動いていたのですが、突然
>> cho.Copy のところで
>>「指定したディメンションは、このグラフの種類では無効です。」
>>のエラーが出るようになりました。(再実行すれば作成されますし、出ないときもあります。)
>>  Set cho = sh_A3.ChartObjects(1).Duplicate.Parent 'コピー元のグラフを複製
>
>DoEventsをこの次に移動あるいは追加してみてはどうでしょうか。
追加してみました。

全学校分のグラフを作るコードと、指定学校分を作るコードの2種類をグラフ元のデータ作成箇所以外、同じコードで作っておりまして、
よくよく調べたら、全学校分の方のみエラーが出ておりましたので、
改めて見比べたら、
Dim cho As ChartObjectを記載していませんでした。
記載したら発生しなくなりましたが、これが原因でしょうか。
いずれにせよ、宣言を忘れないようにします。

>>
>>それから、下記のコードでは、まれに応答なしになって落ちるため、
>
>同じデータで、応答なしになるのでしょうか。
そうだったのです・・。

>>コードの問題点等あればご指摘いただけませんでしょうか。
>
>>   GYO1 = GYO ' グループの先頭行→GYO1
>>   GYO = GYO + 1    ←この行は必要でしょうか?
>
Do While .Cells(GYO, 1).Value <> ""
GYO1 = GYO ' グループの先頭行→GYO1
GYO = GYO + 1 ←A
' 次の行から同じグループでない行を見つける
Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
   GYO = GYO + 1
Loop
GYO2 = GYO  ' 同じグループの最終行→GYO2
GYO = GYO + 1 ←B
〜省略〜
Loop

タイトル行、データ行、合計行のあるデータをグループ化していまして、Aはデータ行に行く処理、Bは次のグループのタイトル行に行くために記載しています。
元々 A学校のデータが複数行、B学校のデータが複数行、・・とあるときに、A学校のデータをグループ化するということをしたくて、ネットで見つけたコードです。
よく使用しているので、応用して作っておりますが、良い方法があれば教えていただけると幸いです。
      (1列)
(タイトル行)質問  
(データ行)A学校名
(データ行)B学校名
(データ行) ・
(データ行) ・
(合計行)  合計
※全学校分のデータ例 
※指定学校分は 「質問、A学校名、合計」の3行のデータ構成だが、今後、選択した複数校のデータをもとにグラフ化したいため、汎用性のあるグループ化を行いたい。

>>   .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1)).Select  
>>    Set r = Selection
>ここはSelectしないで、1行にまとめてはどうでしょうか
>Set r = .Range(.Cells(GYO1, 2), .Cells(GYO2, lastcol1 - 1))
まとめてみました。ご教示ありがとうございます。

>
>グラフの個数でなく、GYOを確認してみてはどうでしょうか。
GYOを確認するよう変更してみましたが、
ご指摘いただいた点を修正したところ、繰り返しても落ちなくなりました。
何かがよかったのでしょうか??

何度もお手を煩わせてしまいましたが、何とかなりそうです。
本当にありがとうございました!
(といいつつまたお尋ねするかもしれません;。その節はご回答いただけると幸いです。)

【82169】Re:ディメンションが無効
発言  マナ  - 23/6/16(金) 21:24 -

引用なし
パスワード
   ▼あおこ さん:

>タイトル行、データ行、合計行のあるデータをグループ化していまして、Aはデータ行に行く処理、Bは次のグループのタイトル行に行くために記載しています。

Aの行はなくても、↓のDo While 〜Loop内で、処理されると思いました。

>Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
>   GYO = GYO + 1
>Loop

【82170】Re:ディメンションが無効
お礼  あおこ  - 23/6/20(火) 10:22 -

引用なし
パスワード
   ▼マナ さん:
>▼あおこ さん:
>
>>タイトル行、データ行、合計行のあるデータをグループ化していまして、Aはデータ行に行く処理、Bは次のグループのタイトル行に行くために記載しています。
>
>Aの行はなくても、↓のDo While 〜Loop内で、処理されると思いました。
>
>>Do While .Cells(GYO, 1).Value <> "合計" '条件を満たしている間処理を繰り返す
>>   GYO = GYO + 1
>>Loop

確かにそうですね!
もともとあるものを継ぎ足して作ることが多いので、いろいろと無駄が多い、、。

今回いろいろ教えていただき、本当に助かりました。
ありがとうございました。

55 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free