Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
コントロールの表示がおかしくなる
投稿日時: 17/12/17 10:05:02
投稿者: pyonpyon

下記条件の場合、コントロールの表示がおかしくなる(オプションボタンやチェックボックス等が
小さく表示されたり、表示位置がずれる)のですが、回避方法はありますか?
 
1)コントロールのあるシートを含め複数のシートを選択
2)ファイル→印刷で印刷ページを開き、何もせずホームタブをクリック
3)シートの複数選択を解除
4)コントロールのあるシートを選択し、いずれかのコントロールを押下した場合
 
※コントロールのあるシートのみで印刷ページ表示後、いずれかのコントロールを押下
 しても本現象は起きません。

回答
投稿日時: 17/12/17 14:27:28
投稿者: WinArrow
投稿者のウェブサイトに移動

最初に
OS、Excelのバージョンを明記してください。
 
少なくとも、回答者側のPCで再現できないと回答がつかないと思います。
 
>コントロール
って、
フォームコントロールのこと?
ActiveXコントロールのこと?
 
で、・・・回答者側のPCで再現できるような情報を提供しましょう。
 
 

投稿日時: 17/12/17 15:00:27
投稿者: pyonpyon

WinArrow さん、ご指摘ありがとうございます。
 
PCはWindows10、エクセルは2010です。
コントロールはフォームコントロールです。

回答
投稿日時: 17/12/17 17:48:11
投稿者: WinArrow
投稿者のウェブサイトに移動

私の環境は、Win10 & Excel2007です。
 
試してみたけど再現しないです。
 
 

回答
投稿日時: 17/12/18 15:57:53
投稿者: もこな2

当方の環境(Win7、Excel2013)で以下を実行してみました。
 
複数シートになるようシートを追加
1番目のシートにフォームコントロールのオプションボタンやチェックボタンを追加
1番目のシートを3番目と入れ替え
1、3、5番目のシートを作業グループ化
Ctrl+P で 印刷画面を表示
数秒待ってからEscで印刷画面を抜ける。
マウスでホームタブをクリックする
シート見出し上のメニューで作業グループを解除する
マウスで3番目のシートを選択する
オプションボタン、チェックボタンを押してみる
 
結果、とくに問題は生じませんでした。
ということから、お使いのマシン固有の問題かもしれないですね。

回答
投稿日時: 17/12/18 18:45:31
投稿者: 細雪

手元にあった組み合わせ・・
 
Win10+Excel2013
Win10+Excel2010 ※コレ、一緒ですね。
Win8.1+Excel2010
Win7+Excel2010
 
全て異常なしです、というのをまずは報告です。
 
 
 
気になるのは、
・どんなコントロールを使っているのか?
  ※ボタン?スピンボタン?それともリストボックス?
・そのコントロールにマクロを仕込んでないか?
  ※仕込んでいるなら、その内容は?
・その他、シート・ブックにマクロが書かれてないか?
といったところでしょうか。
考えられる条件は小出しにせずに、一気に出していただけるとみんな助かります。
 
 
とりあえず、私はコントロールにもシートにもマクロを仕込んでいない状態でテストしました。
質問者さんの環境と違いがあるとしたら、そこだと思いますよ。

投稿日時: 17/12/19 00:12:32
投稿者: pyonpyon

WinArrow さん、もこな2さん、 細雪さん、回答ありがとうございます。
 
ちなみに私のは、Win10 & Excel2007のデスクトップとWin10 & Excel2007のノートPCの2台とも再現します。
 
細雪さんの質問ですが、
>気になるのは、
>・どんなコントロールを使っているのか?
>   ※ボタン?スピンボタン?それともリストボックス?
>・そのコントロールにマクロを仕込んでないか?
>   ※仕込んでいるなら、その内容は?
>・その他、シート・ブックにマクロが書かれてないか?
 
1)ブックは「表紙シート」、「補足事項シート」、「ソート・絞込みシート」で構成。
2)「表紙シート」、「補足事項シート」はマクロや関数はなく、文書を記述しているのみ。
3)「ソート・絞込みシート」は上部にオプションボタン、チェックボックス、テキストボックス、
  ラベルがあり下部は、個人情報(名前、住所等)が500人分あります。
  ユーザは上部のオプションボタン等を操作して下部にある個人情報のソートや絞込みを行います。
  ソースコード全てはかなりの量を記述しているので、ここには書ききれないです。
  
発生条件である4)の時、ソートボタン_Click()のブレイクポイントに止まらずに、オプションボタンは小さくなり、位置もずれた。
1)コントロールのあるシートを含め複数のシートを選択        ←このイベントを拾う処理なし
2)ファイル→印刷で印刷ページを開き、何もせずホームタブをクリック ←Workbook_BeforePrint
3)シートの複数選択を解除                     ←このイベントを拾う処理なし
4)コントロールのあるシートを選択し、ソートボタンを押下した場合  ←ソートボタン_Click()
 
 
Private Sub Workbook_BeforePrint(Cancel As Boolean) ★指摘内容未反映。ご容赦。
       
     Dim Wb As Workbook
     Dim Ws As Worksheet
     Dim DataLastRow As Object
     Dim strSheetName As String
       
● Set Wb = ThisWorkbook    ← ブレイクポイントに止まらない
     Set Ws = Wb.Worksheets("データ")
     Set DataLastRow = Ws.Cells(FirstTitleRow, PriorityCol)
   
     strSheetName = ActiveSheet.Name
       
     If strSheetName <> "表紙" And strSheetName <> "目次" Then
           
         If ActiveSheet.OLEObjects("ソートラジオボタン").Object.Value = True Then
             Application.PrintCommunication = False
             With ActiveSheet.PageSetup
                 .PrintTitleRows = "$25:$25"
                 .PrintTitleColumns = ""
             End With
             Application.PrintCommunication = True
         End If
           
         If ActiveSheet.OLEObjects("絞り込みラジオボタン").Object.Value = True Then
             Application.PrintCommunication = False
             With ActiveSheet.PageSetup
                 .PrintTitleRows = ""
                 .PrintTitleColumns = ""
             End With
             Application.PrintCommunication = True
         End If
               
         ActiveSheet.PageSetup.PrintArea = Ws.Range(Cells(FirstTitleRow, StartCol), _
                                             Cells(DataLastRow, MonneyCol + 1)).Address
       
     End If
       
     Set Wb = Nothing
     Set Ws = Nothing
     Set DataLastRow = Nothing
   
End Sub
  
  
Private Sub ソートボタン_Click()
 
● With Application   ← ブレイクポイントに止まらない
        .EnableEvents = False
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
     
    Call ソートグループ活性化
    Call 絞り込みグループ非活性化 ←ソートグループ活性化と同様。.Enabled = False
    Call 検索グループ非活性化   ←ソートグループ活性化と同様。.Enabled = False
     
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With
 
End Sub
 
 
ブレイクポイントに止まらないので、関係ないと思うが参考まで。

Public Sub ソートグループ活性化()
     
    Set Wb = ThisWorkbook
    Set Ws = Wb.Worksheets("データ")
         
    Ws.OLEObjects("Aボタン").Object.Enabled = True
    Ws.OLEObjects("Bボタン").Object.Enabled = True
    Ws.OLEObjects("Cボタン").Object.Enabled = True
    Ws.OLEObjects("Dボタン").Object.Enabled = True
    Ws.OLEObjects("Eボタン").Object.Enabled = True
    Ws.OLEObjects("ソート実行ボタン").Object.Enabled = True
 
    Set Wb = Nothing
    Set Ws = Nothing
 
End Sub

回答
投稿日時: 17/12/19 08:43:23
投稿者: 細雪

半ばやっつけな回答で申し訳ないのですが、
それってソートされるべきセル領域にオプションボタンの領域が入り込んでいて、
いわゆる「セルに合わせて移動」しているだけでは?
 
問題のオプションボタンを右クリック、コントロールの書式設定、
プロパティタブでオブジェクトの位置関係を「セルに合わせて移動やサイズ変更をしない」を選択
するとどうなりますか?
 

回答
投稿日時: 17/12/19 18:03:23
投稿者: WinArrow
投稿者のウェブサイトに移動

少し説明が不足しているのでは?
 
(1)ブックの構成の中に「データ」シートが書かれていない、
(2)オプションボタンとシートとの関連がよくわからない。
(3)BeforePrintイベントプロシジャでブレイクポイントに止まらない・・・・あり得ないでしょう。
(4)複数シートを選択して印刷しようとしたときの
  ActiveSheetは、意図したシートなんでしょうか?
 複数シートを選択したときは、選択した順序で、ActiveSheetが決められると思いますが、
 シートを特定する場合、Activesheet記述は適切ではないと思います。
 
 

回答
投稿日時: 17/12/19 19:26:24
投稿者: 細雪

時間が経ちましたが、追記です。
 
とりあえずテストとして、
・1行目空白
・2行目項目名
・A列に「A〜Z」を重複無しでランダムに入力(ソート・フィルタ用)
・B3:J28セルにランダムな値(文字列・数値混在)
・シート内のランダムな位置にランダムなコントロールを設置
 なお、コントロールは「セルに合わせて移動はするがサイズ変更はしない」の状態。つまり、初期値。
なシートを作ってみました。
 
でまぁ、ソートのあとに問題が起こるんだろうな、という確信の元、遊んでみました。
その上で、若干訂正です。
 
結果、上記の条件だと「3行目以降に領域の左上があるコントロール」について
ソートされるデータと一緒に上へ行ったり下に行ったりしました。
で、「移動しない」にすると、何も起こらず。
という、半ば予想の範疇を出ない結論です。
ただし「入り込んでいる」ではなくて「左上が」のようです。・・・まぁ、当然なのですが。
 
なお、チェックボックスとオプションボタンについては「小さくなる」なんてことは無いはず。
見た目に大きさが変わるのは「表示倍率を変えたとき」だけのはずです。
 
 
 
ちょっと本筋から逸れて恐縮ですが、ブレイクポイントに止まらない件。
Workbook_BeforePrint は プレビューには反応しません。
なので、プレビューしてもそのタイミングではブレイクもしません。
ソートボタン_Click は、単純に「ソートボタン」という名前のコントロールが無いからでは?
 
・・・と思うんですけどねぇ。

回答
投稿日時: 17/12/19 22:16:37
投稿者: WinArrow
投稿者のウェブサイトに移動

 
>Workbook_BeforePrint は プレビューには反応しません。
  
本当ですか? どこの情報ですか?
 
 
こちらExcel2007の環境です。
ブレイクポイントに反応しますが・・・・
 
 

投稿日時: 17/12/19 23:08:37
投稿者: pyonpyon

細雪さんの下記質問に回答します。
>問題のオプションボタンを右クリック、コントロールの書式設定、
>プロパティタブでオブジェクトの位置関係を「セルに合わせて移動やサイズ変更をしない」を選択
>するとどうなりますか?
→やはり、位置はずれるしオプションボタン等のサイズは小さくなります。
 
下記【発生条件と現象】の「3)シートの複数選択解除」が何か悪さしている気がするのですが・・・
なぜなら、コントロールのあるシート単独では、下記2)、4)を行ってもコントロールの表示がおかしくなることはありませんので。
 
【発生条件と現象】
1)「コントロール+マクロ記述のあるシート」と「文書のみのシート」を複数選択
2)ファイル→印刷で印刷ページを開き、何もせずホームタブをクリック
3)シートの複数選択を解除
4)「コントロール+マクロ記載のあるシート」を選択し、オプションボタン(ソートボタン)を
  クリックするとコントロールのサイズが小さくなり位置がずれる
  →オプションボタン(ソートボタン)をクリックしてもソートボタン_Click()の
   ブレイクポイントに止まらない。
  
上記4)ではオプションボタンとして書いたが、ラベルでもチェックボックスでもテキストボックスでもクリックすると同現象となります。

投稿日時: 17/12/20 00:14:13
投稿者: pyonpyon

 WinArrow さんへ
 
説明が下手で申し訳ないです。→に回答します。
 
 
>(1)ブックの構成の中に「データ」シートが書かれていない、
→「ソート・絞込みシート」のことです。
 
>(2)オプションボタンとシートとの関連がよくわからない。
→「ソート・絞込みシート」は、シート上部に操作エリア、下部にデータエリアの構成です。
→操作エリアは「ソート」と「絞込み」と「検索」の3つの機能があり、オプションボタンで選択します。
→ソートオプションボタンをクリックすると、さらに5個のオプションボタン(ソート条件)をクリックできます。
→絞込みオプションボタンをクリックすると、20個のチェックボックスにより絞込み条件をクリックできます。
→検索オプションボタンをクリックすると、テキストボックスに入力された文字列で検索します。
 
>(3)BeforePrintイベントプロシジャでブレイクポイントに止まらない・・・・あり得ないでしょう。
→今回の現象発生で、まさか止まらないよな?という事を確認したまでです。
 
>(4)複数シートを選択して印刷しようとしたときの
> ActiveSheetは、意図したシートなんでしょうか?
>  複数シートを選択したときは、選択した順序で、ActiveSheetが決められると思いますが、
>  シートを特定する場合、Activesheet記述は適切ではないと思います。
→もともとは、「ソート・絞込みシート」がActiveの時の印刷しか考慮していなかったためです。
→今回ブック印刷なので、確かに適切ではありません。ご指摘ありがとうございます。

回答
投稿日時: 17/12/20 11:35:57
投稿者: 細雪

WinArrow さんの引用:

>Workbook_BeforePrint は プレビューには反応しません。
  
本当ですか? どこの情報ですか?

 
ありゃ?伝達に齟齬があったかな?
当方、まだ2013でしか確認していませんが、
プレビュー前にはマクロは動かず、プレビューから印刷ボタンを押したところで動き出しました。
・Ctrl+P
・クイックアクセスツールバーのプレビューボタン
・ファイルタブから印刷
の3点の確認のみですが、
  上記操作 ⇒ 印刷とプレビュー 表示 ⇒ 印刷ボタン
    ⇒ Workbook_BeforePrint 動作(ブレイクポイント反応確認)
       ⇒ Workbook_BeforePrint の処理が完了 ⇒ 印刷(スプール)
の順で動きました。
Workbook_BeforePrint の中身は
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    With ActiveSheet.PageSetup
        .PrintTitleRows = "$1:$1"
    .PrintArea = "$A$1:$B$10" ' ココでブレイク
    End With
 
    MsgBox ""
End Sub
コレだけの単純なモノではありますが・・・
プレビュー ⇒ キャンセル(シートに戻る) ではマクロが動かなかった、ということで
「プレビューでは(マクロが動かないので)ブレイクポイントに反応しない」と表現しました。
 
 
で、本題。
記載に従って、なるべく近いモノを作って試そうとしているのですが、
やはり何かが違う様で「動く・サイズが変わる」条件に辿り着けずにいます。
 
ところで、「フォームコントロール」との申告がありましたが、
> Ws.OLEObjects("Aボタン").Object.Enabled = True
ってことは、ActiveXコントロールを使っていたりしませんか?
あまり関係ないかもしれませんが、ちょっとだけ気になったもので。
・・・と言っても、コントロールをActiveXに変えても先述の通り、
どうやっても再現できないでいるのですが・・
コントロールの位置によっての変化はありましたが、
「セルに合わせて移動しない」を選択することで回避できています。
コレも先述の通りです。
あと考えられること・・条件が出揃わない限り再現もできないので・・ここらが私の限界かなぁ。
いやはや、掻き混ぜるだけでお力になれず申し訳ないです。
 
 
 
「ソートボタン」に割り振ったマクロのブレイクポイントが反応しない件。
経験上・・と言ってもそんなに深くはないですが、
ちゃんとマクロを割り振ってあれば反応しないことはないと思っています。
BeforePrint は上述の通り、マクロが動き出すタイミングの問題だと思うのですが、
ソートボタンについてはもう一度割り当てを確認した方が良いかもです。

回答
投稿日時: 17/12/20 18:31:54
投稿者: WinArrow
投稿者のウェブサイトに移動

どこで、コントロールのサイズが変わってしまうかを判明することが先決なのかな?と考えます。
 
一寸手間が掛るけど、
 
あらゆるところで
Debug.Pront を設置して、処理をトレースできるようにし、
且つ、コントロールのサイズもイミディトウィンドウへ表示
 
こんな方法を試してみては?

回答
投稿日時: 17/12/20 21:01:10
投稿者: ちゃこ

WinArrow さんの引用:

>Workbook_BeforePrint は プレビューには反応しません。
  
本当ですか? どこの情報ですか?
 
 
こちらExcel2007の環境です。
ブレイクポイントに反応しますが・・・・
 
 

余計なことかもしれませんが……
Excel2010からWorkbook_BeforePrint は プレビューには反応しないようです
https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_other-mso_2010/%EF%BD%85%EF%BD%98%EF%BD%83%EF%BD%85%EF%BD%8C/e00ab828-57e1-4100-9a3d-9c25ee617612

回答
投稿日時: 17/12/20 21:59:12
投稿者: WinArrow
投稿者のウェブサイトに移動

ちゃこ さん
 
仕様が変わったんですね・・・
情報ありがとうございました。
 

回答
投稿日時: 17/12/20 22:34:50
投稿者: baoo

私の所でも基本的に再現したわけではないのですが、
一瞬だけなら表示がおかしくなる現象は再現できました。
コードの統一ということも大事だと思いますので、
サンプルコードを提示します。
 
下記コードを新規ブックの標準モジュールに貼り付けてファイル保存後、
再起動してアドインリボンの[印刷バグチェック]を押してください。
印刷プレビュー画面になりますので、[印刷プレビューを閉じる]ボタンを
押して閉じたのち表示されるSheet2上の各コントロールを
クリックしてみてください。
各コントロール毎に一度だけ一瞬、小さく表示されます。
 
データが多いなど重い場合に描画が間に合わず表示が残ってしまうような
ことがあればpyonpyonさんと同じ現象が発生するかもしれません。
pyonpyonさんは本コードで再現しますでしょうか?
 

Option Explicit
Private Sub Auto_Open()

    Dim i As Long
    Dim cb As CommandBar
    
    For Each cb In Application.CommandBars
        If cb.Name = "印刷バグ" Then
            cb.Delete
        End If
    Next
    
    Set cb = Application.CommandBars.Add("印刷バグ", msoBarTop, , True)
    With cb.Controls.Add(msoControlButton)
        .Caption = "印刷バグチェック"
        .OnAction = "CheckPrintBug"
        .Style = msoButtonCaption
    End With
    cb.Visible = True

End Sub
    
Private Sub CheckPrintBug()
    
    Dim i As Long
    
    With ThisWorkbook
        
        'リセット(シート1のみ)
        Application.DisplayAlerts = False
        For i = .Worksheets.Count To 2 Step -1
            .Worksheets(i).Delete
        Next i
        Application.DisplayAlerts = True
        
        'シート2、3を追加
        For i = 1 To 3
            If .Worksheets.Count < i Then
                .Worksheets.Add(After:=.Worksheets(i - 1)).Name = "Sheet" & i
            Else
                .Worksheets(i).Name = "Sheet" & i
            End If
        Next i
    
        'Sheet2にコントロール配置
        MakeSheet .Worksheets("Sheet2")
        
        '各シートのズーム倍率を変更
        .Worksheets("Sheet2").Select
        ActiveWindow.Zoom = 50
        .Worksheets("Sheet3").Select
        ActiveWindow.Zoom = 200
        
        '作業グループ作成
        .Worksheets(Array("Sheet2", "Sheet3")).Select
    
        '印刷プレビュー表示([ファイル]->[印刷]の代用)
        ActiveWindow.SelectedSheets.PrintPreview
    
        '分かりやすくするためSheet2のズーム倍率を200
        .Worksheets("Sheet2").Select
        ActiveWindow.Zoom = 200
        
    End With
    

End Sub

Private Sub MakeSheet(sht As Worksheet)

    Dim i As Long
    
    With sht.OLEObjects
        'OptionButton
        For i = 1 To 8
            With .Add(ClassType:="Forms.OptionButton.1", Width:=100, Height:=15)
                .Name = "OptionButton" & i
                If i < 4 Then
                    'OptionButton1-OptionButton3
                    .Left = 30 + (i - 1) * 100
                    .Top = 30
                    .Object.GroupName = "A"
                Else
                    'GoupB(OptionButton1)
                    .Left = 30
                    .Top = 50 + (i - 3) * 15
                    .Object.GroupName = "B"
                End If
            End With
        Next i
        
        'GroupC(OptionButton2)
        For i = 1 To 20
            With .Add(ClassType:="Forms.CheckBox.1", Left:=130, Width:=100, Height:=15)
                .Name = "CheckBox" & i
                .Top = 50 + i * 15
                .Object.GroupName = "C"
            End With
        Next i
        
        'NoGroup(OptionButton3)
        With .Add(ClassType:="Forms.TextBox.1", Left:=230, Width:=100, Height:=15)
            .Name = "TextBox1"
            .Top = 50 + 15
        End With
        With .Add(ClassType:="Forms.Label.1", Left:=230, Width:=100, Height:=15)
            .Name = "Label1"
            .Top = 50 + 15 * 2
        End With
        With .Add(ClassType:="Forms.Label.1", Left:=230, Width:=100, Height:=15)
            .Name = "Label2"
            .Top = 50 + 15 * 3
        End With
        
    End With
    
End Sub

投稿日時: 17/12/20 23:46:22
投稿者: pyonpyon

baoo さん、やってみましたが再現しませんでした。
シート2のオプションボタン、チェックボックス、テキストボックス、ラベル全てクリックしましたが
大きさは変わらず、位置もそのままでした。

回答
投稿日時: 17/12/21 01:50:41
投稿者: baoo

すみません。
環境を書いていませんでした。
私のノーパソはWindows10+Office2013ですが、
この環境では一瞬表示がおかしくなる現象が発生します。
デスクトップPCはWindows10+Office2010ですが、
この環境では発生しませんでした。
 
それで再度色々動かしていたのですが、また少しおかしな表示が発生しました。
1.同じように印刷バグチェックボタンをクリック。
2.同じように印刷プレビュー画面で[印刷プレビューを閉じる]ボタンをクリック
3.処理が終了後、VBE上でSheet2のワークシートモジュールに下記コードを貼り付ける。
4.CheckBox1から順にクリックしてCheckBox6までチェックを付ける。
 
各CheckBoxをクリック時にメッセージが表示されますが、
その最中は前回付けたチェックが消える。
メッセージにOKボタンをクリックすると再度チェックが付く。
 
こちらもデスクトップ環境では発生しませんでした。
しかし、Windows10+Office2013で発生するのか、環境(個体)によるのかは
分かりません。

Private Sub CheckBox1_Click()
    MsgBox "fuga"
End Sub
Private Sub CheckBox2_Click()
    MsgBox "fuga"
End Sub
Private Sub CheckBox3_Click()
    MsgBox "fuga"
End Sub
Private Sub CheckBox4_Click()
    MsgBox "fuga"
End Sub
Private Sub CheckBox5_Click()
    MsgBox "fuga"
End Sub
Private Sub CheckBox6_Click()
    MsgBox "fuga"
End Sub

投稿日時: 17/12/21 22:39:32
投稿者: pyonpyon

WinArrow さん、もこな2さん、 細雪さん、ちゃこさん、baooさんへ
 
やっと見つけました。下記に同様の記事がありました。
http://sakaik.hateblo.jp/entry/20140723/strange_excel2010
 
根本解決ではないですが、ここに記載されている”コンポーネントを「グループ化」する”でとりあえず回避できましたのでご報告いたします。
 
これまで色々とご教示くださいました方々に熱く御礼申し上げます。