none
Excel VBA で印刷プレビューを表示し、印刷すると、日付入力のショートカットキーで表示される日付のフォーマットが変わってしまう。 RRS feed

  • 質問

  • 御世話になります。

    Excel では、[CTRL]+[;] が今日の日付が入力できるショートカットキーとなっており、

    通常 yyyy/m/dの形式で日付が入力されるかと思います。

    ところが VBAマクロで ActiveSheet.PrintPreview を実行し、印刷を実行すると、

    どういうわけか、同じショートカットキーで m/d/yyyy の形式で入力されるようになります。

    (確定前の話ですので、セルの書式設定等は関係ないと思われます。

    ちなみにそのままENTER を押しても日付と認識されません。またイミディエイトウィンドウから

    この1行だけ実行しても同じ現象が発生しますので、前後のプログラムには関係していないと

    思われます。)

    印刷プレビューだけ実行し、印刷しない場合にはこの問題はおきません。

    印刷プレビューについては、ActiveSheet.PrintOut Preview:=True としても

    同じ問題が発生しますが、

    プレビューせずに、ActiveSheet.PrintOut で印刷したり

    Application.CommandBars.ExecuteMso "PrintPreviewAndPrint"
    としてバックステージビューから印刷する場合には問題は起きないようです。

    しかし、ActiveSheet.PrintPreview

    の方が大きく表示出来ますので、出来ればこちらを使いたいわけです。

    OSやExcelのバージョンが関係するか分かりませんが、

    OSは Windows7 Proffessional (32bit) 、Excel は Excel 2010 です。

    別のPC(Windows7 Ultimate 64bit Excel 2013 32bit)でも発生します。

    いずれも日本語です。

    問題が起きた後元に戻す手段も分かりません。

    Excel を別プロセスで、もう一つ立ち上げると、そちらでは正常(yyyy/m/d)に入力出来ますので、

    OS側の設定等を書き換えてしまっているというようなわけでもなさそうです。

    回避方法、ないしは元に戻す方法がありましたら御教示下さい。

    2014年9月17日 9:26

回答

  • 2007までは正常に動作するのでバグっぽいですねぇ
    おかしくなった状態で再度印刷プレビュー->印刷を行うと元に戻りますし。
    あとCTRL+:での時刻入力も変わってしまいますね。

    セルが選択された状態でのショートカットを変更してやれば部分的な回避はできました。
    ただし、セルの入力途中ではマクロを実行できないので完全な回避はできませんが…

    'おかしくなるショートカットを上書き
    Sub EnableOverrideShortcut()
        If (Application.Version >= 14) Then '2010~2013
            Call Application.OnKey("^;", "'OverrideShortcut "";""'") 'CTRL+; 日付
            Call Application.OnKey("^:", "'OverrideShortcut "":""'") 'CTRL+: 時刻
        End If
    End Sub
    'おかしくなるショートカットをデフォルトに戻す
    Sub DisableOverrideShortcut()
        Call Application.OnKey("^;")
        Call Application.OnKey("^:")
    End Sub
    'おかしくなるショートカットの代替処理
    Public Sub OverrideShortcut(ByVal s As String) 'モジュールに配置する
        Dim t As Date
        t = Now
        
        Dim sDate As String
       
        Dim sTime As String
        sTime = Hour(t) & ":" & Minute(t)
        
        If Not (Application.ActiveCell Is Nothing) Then
            If (s = ";") Then 'CTRL+; 日付
                Dim dateOrder As Integer
                Dim dateSeparator  As String
                dateOrder = Application.International(xlDateOrder)
                dateSeparator = Application.International(xlDateSeparator)
        
                Select Case (dateOrder)
                Case 0:
                    sDate = Month(t) & dateSeparator & Day(t) & dateSeparator & Year(t)
                Case 1:
                    sDate = Day(t) & dateSeparator & Month(t) & dateSeparator & Year(t)
                Case 2:
                    sDate = Year(t) & dateSeparator & Month(t) & dateSeparator & Day(t)
                End Select
                
                Application.ActiveCell.Value = sDate
            ElseIf (s = ":") Then 'CTRL+: 時刻
                Application.ActiveCell.Value = sTime
            End If
            
            Application.SendKeys ("{F2}")
        End If
    End Sub

    #VSTOをつかってフックしてやれば入力途中も処理できるとおもうけど


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク light_userUG 2014年9月27日 7:44
    2014年9月22日 3:54

すべての返信

  • こんにちは。

    Windows 7 + Excel 2010(x86)環境で問題確認できました。
    たしかに、

    ActiveSheet.PrintPreview

    印刷

    [Ctrl + ;]で日付入力

    すると、m/d/yyyy形式で日付が入力されました。
    動きとしては仕様というか、バグのような気がします。

    PrintPreviewではなく「Application.CommandBars.ExecuteMso "FilePrintPreview"」を使うと、私の環境では問題が発生しませんでしたので、一度試してみてはいかがでしょうか。

    Option Explicit
    
    Public Sub Test1()
      Application.CommandBars.ExecuteMso "FilePrintPreview" '問題が発生しない
    End Sub
    
    Public Sub Test2()
      ActiveSheet.PrintPreview '問題が発生する
    End Sub

    2014年9月18日 1:41
  • 御検証・御回答ありがとうございます。

    こちらの環境でも「Application.CommandBars.ExecuteMso "FilePrintPreview"」では問題は発生しないようですので、現在はこれで運用しています。

    しかしながら、印刷前の最終確認をする目的でプレビューするようにしていますので、出来る事なら大きな画面で確認したいわけです。バックステージビューの画面で、1枚分の横幅を見通せるサイズだと小さすぎます。かといって拡大するとスクロールしながら確認しないといけませんので非常に不便です。

    なんらかの回避方法がないものでしょうか。

    2014年9月18日 11:40
  • こんにちは。

    Backstage ビューに新しいタブやボタンを追加したり、ということはできるのですが、「印刷」タブのプレビュー画面をカスタマイズすることは出来ないだろうと思います。

    せめて出来ることと言えば、「印刷プレビュー (全画面表示)」をクイック アクセス ツール バーに追加しておいて、印刷前にそのボタンからプレビューを確認する、くらいでしょうか・・・。
    2014年9月20日 0:31
  • 申し訳ありません。質問しておりますのはVBAにおける回避手段です。

    2014年9月20日 5:38
  • こんにちは。

    Backstage ビューの印刷プレビューをどうこうしたいというのではなく、

    > 1枚分の横幅を見通せるサイズだと小さすぎます。かといって拡大するとスクロールしながら確認しないといけません

    このプレビュー機能の仕様そのものをVBAで何とか回避したいということでしょうか?
    それでしたらとても難しいと思います。

    個人的には、大きめのディスプレイを使って、自分好みの解像度でExcelを使うことをお薦めいたします。


    また、本質問のように、最初の本題([CTRL]+[;]のフォーマットが変わってしまう)とは別の問題がある場合には、新規スレッドで質問された方が良いでしょう。
    2014年9月22日 0:53
  • 回避方法は今の所見当たらないようなので,対処療法で

    シートモジュールへ以下のように書いておきます。

    行や列の指定範囲は1~100行のA列にしてありますが,変更して下さい。

    変更された形式の文字列を,強制的に日付形式に直してしまおうというマクロです。

    これで指定した範囲は日付形式に変換されると思います。

    分かりやすいように,やっつけで書いたコードなのでもっと洗練したマクロに直して使用されたら良いと思います。

    右から5文字が /2*** の場合に変換させていますが,この辺も違うなら変えてみると良いかと思います。


    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim myStr1 As String, myStr2 As String, myStr3 As String, myStr4 As String

        If Target.Row > 0 And Target.Row < 101 And Target.Column = 1 Then
            myStr1 = Target.Cells(1, 1)
            If Right(myStr1, 5) Like "/2***" Then
                myStr2 = Right(myStr1, 4)
                myStr3 = Left(myStr1, Len(myStr1) - 5)
                myStr4 = myStr2 & "/" & myStr3
                Target.Cells(1, 1) = myStr4
            End If
        End If
    End Sub

    2014年9月22日 2:37
  • すみません。

    *は0個以上の任意の文字で?は任意の1文字なので

    /2*** の部分は /2??? の方が良いですね。


    2014年9月22日 3:13
  • 2007までは正常に動作するのでバグっぽいですねぇ
    おかしくなった状態で再度印刷プレビュー->印刷を行うと元に戻りますし。
    あとCTRL+:での時刻入力も変わってしまいますね。

    セルが選択された状態でのショートカットを変更してやれば部分的な回避はできました。
    ただし、セルの入力途中ではマクロを実行できないので完全な回避はできませんが…

    'おかしくなるショートカットを上書き
    Sub EnableOverrideShortcut()
        If (Application.Version >= 14) Then '2010~2013
            Call Application.OnKey("^;", "'OverrideShortcut "";""'") 'CTRL+; 日付
            Call Application.OnKey("^:", "'OverrideShortcut "":""'") 'CTRL+: 時刻
        End If
    End Sub
    'おかしくなるショートカットをデフォルトに戻す
    Sub DisableOverrideShortcut()
        Call Application.OnKey("^;")
        Call Application.OnKey("^:")
    End Sub
    'おかしくなるショートカットの代替処理
    Public Sub OverrideShortcut(ByVal s As String) 'モジュールに配置する
        Dim t As Date
        t = Now
        
        Dim sDate As String
       
        Dim sTime As String
        sTime = Hour(t) & ":" & Minute(t)
        
        If Not (Application.ActiveCell Is Nothing) Then
            If (s = ";") Then 'CTRL+; 日付
                Dim dateOrder As Integer
                Dim dateSeparator  As String
                dateOrder = Application.International(xlDateOrder)
                dateSeparator = Application.International(xlDateSeparator)
        
                Select Case (dateOrder)
                Case 0:
                    sDate = Month(t) & dateSeparator & Day(t) & dateSeparator & Year(t)
                Case 1:
                    sDate = Day(t) & dateSeparator & Month(t) & dateSeparator & Year(t)
                Case 2:
                    sDate = Year(t) & dateSeparator & Month(t) & dateSeparator & Day(t)
                End Select
                
                Application.ActiveCell.Value = sDate
            ElseIf (s = ":") Then 'CTRL+: 時刻
                Application.ActiveCell.Value = sTime
            End If
            
            Application.SendKeys ("{F2}")
        End If
    End Sub

    #VSTOをつかってフックしてやれば入力途中も処理できるとおもうけど


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク light_userUG 2014年9月27日 7:44
    2014年9月22日 3:54
  • gekka さまプログラムのご提供ありがとうございます。

    このプログラムを使用する場合、これと共に使用するプログラムも「MICROSOFT LIMITED PUBLIC LICENSE」によって配布しなければなりませんか?

    それだと社内で使用するわけにはいかないようですが、貴重な情報をいただきありがとうございました。

    2014年9月27日 7:44
  • 自由に使用して大丈夫ですよ。感染性もないライセンスですし。
    MICROSOFT LIMITED PUBLIC LICENSE

    あえてライセンスを厳密に適用するのであれば、このVBAのソースコードを改変せずに貼り付けておけばいいです。Microosftプラットフォーム限定となっている部分もEXCEL VBAはEXCELでしか動作しないコードなので問題ありません。
    と思ったら、(F)でWindowsOS限定となっていて、Mac版のEXCELでも動作させようとするとに引っかかりますね。

    「本コードはMICROSOFT LIMITED PUBLIC LICENSEを適用しない。自由に使用してもよい。」ということにしましょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年9月29日 15:02 リンクアドレスがおかしかったのを修正しました。
    2014年9月27日 9:04
  • gekkaさん、細かい話で申し訳ありませんが、

    > 「MICROSOFT LIMITED PUBLIC LICENSE

    このリンクですが、 ":" が落ちています。
    たまには、確認してみようとしたのですが、

      http://msdn.microsoft.com/ja-JP/cc300389

    で良いですね。

    2014年9月29日 13:51