0

私のスプレッドシートには、19 行ごとにデータのブロックがあります。ユーザーがブロックの横にあるグラフィック矢印をクリックして、画面の上部に次または前のブロックを表示できるように、vba を書きたいと思います。必要なのはコードだけです。グラフィックをリンクすることは問題ありません。ユーザーが現在作業している 30 のブロックのどれかを判断するアルゴリズムが既にあります。

これを行うためにさまざまな方法を試しましたが、私が考えていたことを正確に行うものはないようです。

ユーザーがそのブロックにデータを入力できるように、セルを画面の下部に置いておくことができるため、グラフィックを目的のブロックのセルにリンクすることはできません。私が探しているソリューションは、ダッシュボードに似た行のブロックを表示します。何日もグーグルで検索しましたが、解決策が見つかりませんでした。おそらく、検索する言語がわからないのでしょう。

何か案は?

4

3 に答える 3

0

まあ、最良の答えは次のとおりです。これまで、Excel を表計算プログラム以上のものに押し上げないでください。しかし、そうは言っても...何ができるか見てみましょう。

基本的な考え方: 文字通り 1 つのブロックのみを表示し、他のすべての行を非表示にします。これを新しいモジュールに入れます:

Public Sub goto_block(n As Long)
    Dim ws As Worksheet
    Dim i As Long

    If n < 1 Then Exit Sub
    Application.ScreenUpdating = False
    Set ws = Worksheets(1)
    ws.Rows.Hidden = True
    ws.Rows( _
        CStr((n - 1) * 19 + 1) & ":" & CStr((n - 1) * 19 + 19) _
        ).EntireRow.Hidden = False
    Application.ScreenUpdating = True
    ws.Cells((n - 1) * 19 + 1, "A").Select
End Sub

上下のブラウジングは、さまざまな方法で行うことができます。これは、列 M/L の最初の (一番上に表示されている) セルを右クリックして上下に移動する方法を示しています。(これをワークシートのモジュールにコピーします):

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim curBlock As Long

    If Target.Cells.Count = 1 Then
        If (Target.Row Mod 19) = 1 Then

            curBlock = Int((Target.Row - 1) / 19) + 1

            If Not Application.Intersect(Target, Me.Columns("M")) Is Nothing Then
                goto_block curBlock + 1
                Cancel = True
                Exit Sub
            ElseIf Not Application.Intersect(Target, Me.Columns("L")) Is Nothing Then
                goto_block curBlock - 1
                Cancel = True
                Exit Sub
            End If

        End If
    End If
End Sub
于 2013-08-03T09:08:15.680 に答える