web-dev-qa-db-ja.com

Excel 2007 VBAでExcelワークシートの一番上の行をプログラムでフリーズするにはどうすればよいですか?

VBAのExcelワークシートの最上行をプログラムでフリーズしたいと考えています。最終目標は、Excel 2007のView > Freeze Panes > Freeze Top Rowコマンドと同じ効果を生成して、ワークシートの最上行が固定され、ユーザーがデータをスクロールしてもワークシートの最上行が見えるようにすることです。

37
LJ.
Rows("2:2").Select
ActiveWindow.FreezePanes = True

手動で行うのとほぼ同じ方法で、異なる効果の異なる範囲を選択します。 「フリーズトップ行」は、Excel 2007(およびそれ以降)の新しいショートカットであり、以前のバージョンのExcelと比較して追加機能はありません。

39
Tomalak

トマラックはすでに正しい答えを与えてくれましたが、ユーザーインターフェイスで特定のアクションを実行するために必要なVBAコードを知りたい場合は、マクロを記録することをお勧めします。

この場合、リボンの開発者タブでマクロの記録をクリックし、一番上の行を固定してから記録を停止します。 Excelには、ジョブを実行する次のマクロが記録されます。

With ActiveWindow
    .SplitColumn = 0
    .SplitRow = 1
End With
ActiveWindow.FreezePanes = True
17
Dirk Vollmar

記録されたマクロの問題は、組み込みアクションの問題と同じです。Excelは、実際の行ではなく、上部visible行をフリーズすることを選択しますヘッダー情報が見つかる最上行。

この場合のマクロの目的は、実際の一番上の行を固定することです。行#405592を表示していて、列のヘッダーを確認する必要があるとき(ファイルを開いたときに行をフリーズするのを忘れていたため)、一番上までスクロールし、一番上の行をフリーズしてから、戻る方法を見つける必要があります行#405592もう一度。これはバカな振る舞いだと思うので、マクロに修正してもらいたいのですが、先ほど言ったように、記録されたマクロは同じバカな振る舞いを模倣しています。

Mac OS X LionでOffice 2011を使用しています

更新(2分後):

私はここで解決策を見つけました: http://www.ozgrid.com/forum/showthread.php?t=19692

Dim r As Range 
Set r = ActiveCell 
Range("A2").Select 
With ActiveWindow 
    .FreezePanes = False 
    .ScrollRow = 1 
    .ScrollColumn = 1 
    .FreezePanes = True 
    .ScrollRow = r.Row 
End With 
r.Select 
13
Dannid

ちょうど同じ問題にぶつかります...何らかの理由で、freezepanesコマンドが画面の中央に十字線を表示させました。 ScreenUpdatingをオフにしていたことはありません!次のコードで解決しました:

Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True

今では正常に動作します。

8
Tom M

この質問をExcelのVBA以外の使用領域に拡張するには、 ActiveWindowプロパティExcel.Applicationオブジェクト の子としてアドレス指定する必要があります。

AccessからExcelブックを作成する例:

別のOfficeアプリケーションのVBAプロジェクトで Excel.Applicationオブジェクト を使用するには、Microsoft Excel 15.0オブジェクトライブラリ(または独自のバージョンに相当するもの)を追加する必要があります。

Option Explicit

Sub xls_Build__Report()
    Dim xlApp As Excel.Application, ws As Worksheet, wb As Workbook
    Dim fn As String

    Set xlApp = CreateObject("Excel.Application")
    xlApp.DisplayAlerts = False
    xlApp.Visible = True

    Set wb = xlApp.Workbooks.Add
    With wb
        .Sheets(1).Name = "Report"
        With .Sheets("Report")

            'report generation here

        End With

        'This is where the Freeze Pane is dealt with
        'Freezes top row
        With xlApp.ActiveWindow
            .SplitColumn = 0
            .SplitRow = 1
            .FreezePanes = True
        End With

        fn = CurrentProject.Path & "\Reports\Report_" & Format(Date, "yyyymmdd") & ".xlsx"
        If CBool(Len(Dir(fn, vbNormal))) Then Kill fn
        .SaveAs FileName:=fn, FileFormat:=xlOpenXMLWorkbook
    End With

Close_and_Quit:
    wb.Close False
    xlApp.Quit
End Sub

コアプロセスは、実際には以前に送信された回答の繰り返しにすぎませんが、ExcelのVBA内にいない場合にActiveWindowに対処する方法を示すことが重要だと思いました。ここでのコードはVBAですが、他の言語やプラットフォームに直接転写できる必要があります。

6
user4039065
Rows("2:2").Select
ActiveWindow.FreezePanes = True

これが一番上の行をフリーズする最も簡単な方法です。 FreezePanesのルールは、選択したセルから左上隅をフリーズします。たとえば、C10を強調表示すると、列BとC、行9と10の間でフリーズします。したがって、行2を強調表示すると、実際には最上行である行1と2の間でフリーズします。

また、.SplitColumnまたは.SplitRowは、フリーズ解除するとウィンドウが分割されますが、これは私が好む方法ではありません。

3
ian0411