アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルVBAで、非表示にした行は飛ばしてスクロールさせる方法を教えて下さい。

下記の画像のようなエクセルの表があったとします。

A2セルに設置した「下へ」ボタンを押す度に、(ウィンドウ枠の固定をA2セルの下でやっているので)現在のA3セルがある場所に、最初にA17セル、次にA28セル、と、各会社の一番上の行が来るようなマクロを作りたいと思いました。

ただし、もう取引のない会社等の理由で、非表示にしてある会社は飛ばしてスクロールさせたいのえすが、飛ばすことが出来ません。

画像で説明しますと、A社が一番上に表示してある状態で、「下へ」ボタンを1回押すと、C社が一番上に来るようにしたいのですがうまくいきません。

どうしたらよいのでしょうか?

Sub 下スクロール()

s = Selection.Row '現在選択されているセルの行番号をs変数として表現

Cells(s, 1).Select '選択されているセルのA列を選択(A列以外の列が選択されていた時の為)

au = Selection.Row '選択されている結合セルの一番上の行番号をau変数と表現

'ad3 = Selection.Offset(3, 0).Row
'ad3 = Cells(au + Range("A" & au).MergeArea.Count - 1, 1).Offset(3, 0).Row
ad3 = Cells(au + Range("A" & au).MergeArea.Count - 1, 1).Row + 3 '結合セルの一番下の行から3行下の行をad3変数で表現

ActiveWindow.ScrollRow = ad3 'ad3行が一番上に来るようスクロール
Cells(ad3, 1).Select 'A列を選択

End Sub

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

「エクセルVBAで、非表示にした行は飛ばし」の質問画像

A 回答 (3件)

基本的に、データベースとして扱うにはセルの結合はやめましょう


また空白行もやめましょう

そこからスタートしてください
    • good
    • 0
この回答へのお礼

知りたい事をこちらに聞くためにデータベースっぽいものを例として挙げましたが、実際にはまったく別ものでして。

よって実際にはデータベースとか取引先会社に関する云々ファイルではまったくないのですよ^^;

でも、データベースをもし今後作る機会が合った時には、よくその事を考えます。

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

お礼日時:2010/07/07 10:29

Rows(ad3).Hidden


を調べて、Trueだったらその行は非表示なので、その場合はその次の会社を見つけるようにしましょう。
    • good
    • 0
この回答へのお礼

出来ました!
感謝です!

Sub 下スクロール()

s = Selection.Row '現在選択されているセルの行番号をs変数として表現

Cells(s, 1).Select '選択されているセルのA列を選択(A列以外の列が選択されていた時の為)


Do While hihyouji < 1 'hihyouji変数が1より大きくなるまで繰り返す

au = Selection.Row '選択されている結合セルの一番上の行番号をau変数と表現

ad3 = Cells(au + Range("A" & au).MergeArea.Count - 1, 1).Row + 3 '結合セルの一番下の行から3行下の行をad3変数で表現

ActiveWindow.ScrollRow = ad3 'ad3行が一番上に来るようスクロール
Cells(ad3, 1).Select 'A列を選択

If Rows(ad3).Hidden = True Then '非表示行かどうか判断
hihyouji = 0 '非表示行だった場合、hihyouji変数に「0」を代入

Else
hihyouji = 1 '非表示行ではない場合、hihyouji変数に「1」を代入

End If

Loop

End Sub

お礼日時:2010/07/07 11:30

>エクセルVBAで、非表示にした行は飛ばしてスクロールさせる方法を教えて下さい。


たぶん、質問内容が間違いだと思います。コードを見る限りは、そのようにはなっていないので、どちらかが間違っていると思います。「次の会社」に飛ぶなら、Merge セルを探すのであって、非表示行を飛ばすことではありません。

そして、この手の質問は、プロの人でない限りは見ただけでは、分からないと思います。

私も以前作ったことがありますが、個人的には、いくら作っても、何かが足りないような気がしてなりません。たぶん、本来は、Do ~ Loop の扱いのコードのような気がします。なお、画面の動きが大きいので、イベントで、SelectionChange で、ボタンそのものを画面に連動させたほうがよいかもしれません。

今回は、データ行を探すのに、UsedRange.Columns(1)を使っていますが、Range("A1", Cells(Rows.Count, 1).End(xlUp)) をしても良いと思います。

'//
Sub NextDownJump()
'下スクロール
 Dim i As Long, j As Long, n As Long
 With ActiveSheet.UsedRange.Columns(1)
  j = ActiveCell.EntireRow.Cells(1, 1).MergeArea.Row
  For i = j To .Cells.Count
   n = .Cells(i).MergeArea.Rows.Count
   i = i + n
   If .Cells(i).MergeCells Then Exit For
  Next
  .Cells(i).Select
 End With
End Sub

Sub BeforeUpJump()
'上スクロール
 Dim i As Long, j As Long, n As Long
 With ActiveSheet.UsedRange.Columns(1)
  j = ActiveCell.EntireRow.Cells(1, 1).MergeArea.Row
  j = j - 1
  If j = 1 Then Exit Sub
  For i = j To 1 Step -1
   If .Cells(i).MergeCells Then Exit For
  Next
  .Cells(i).Select
 End With
End Sub


ボタンの移動:ボタンの列は空白のほうがよいです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   WinTop = ActiveWindow.VisibleRange.Top
   Sheet1.Shapes("ボタン 1").Top = WinTop + 3
   Sheet1.Shapes("ボタン 2").Top = WinTop + 8 '←調整してください。
End Sub
    • good
    • 0
この回答へのお礼

詳しくありがとうございます。

私も初心者ながらdo~loopにたどりつきました。

Sub 上スクロール()

s = Selection.Row '現在選択されているセルの行番号をs変数として表現

Cells(s, 1).Select '選択されているセルのA列を選択(A列以外の列が選択されていた時の為)

Do While hihyouji < 1 'hihyouji変数が1より大きくなるまで繰り返す

au3 = Selection.Row - 3 '選択されているセルの3つ上のセルの行番号をau3変数で表現
Cells(au3, 1).Select '3つ上のセルのA列を選択

au = Selection.Row '選択されている結合セルの一番上の行番号をau変数と表現

ActiveWindow.ScrollRow = au 'au行が一番上に来るようスクロール
Cells(au, 1).Select 'A列を選択

If Rows(au).Hidden = True Then '非表示行かどうか判断
hihyouji = 0 '非表示行だった場合、hihyouji変数に「0」を代入

Else
hihyouji = 1 '非表示行ではない場合、hihyouji変数に「1」を代入

End If

Loop

End Sub

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

お礼日時:2010/07/07 11:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています