一つ上のセルの値のみ取得

今日は、こちらの記事に便乗。
koroko.hatenablog.com

コロ子さんが挑戦されているように、「フィルターが掛かっていても」がポイントだと思う。
f:id:Infoment:20190911222327p:plain

以下の条件を全て満足する場合、簡略化が可能だ。

  1. 選択セルが空白である。
  2. 一つ上のセル(隠れているものを除く)が、空白ではない。

この場合フィルターの有無に関わらず、選択中のセルから「End(xlUP)」を用いれば、空白ではない一つ目のセルが選択される。

Sub ArrayOnOne()
    Selection.Value = Selection.Offset(Selection.Item(1).End(xlUp).Row - _
                      Selection.Item(1).Row).Value
End Sub

しかし、一つ上が空白の場合、本来空白が入力されるべきところ、さらに一つ上が入力されてしまう。

また、選択中のセルに、既に何か文字が入力されている場合。
f:id:Infoment:20190911223636p:plain

この場合も、意図しない結果が返ってしまう。
f:id:Infoment:20190911223709p:plain

ということで、やはり地道に探しに行くのが一番良さそうだ。

Sub ValueOnOne()
    Dim i As Long
    
        ' 選択範囲の左上セルから見て、一行ずつ上のセルを確認する。
        ' 表示されている場合、その値を選択範囲に入力する。
        For i = 1 To Selection.Item(1).Row - 1
            If Rows(Selection.Item(1).Row - i).Hidden = False Then
                Selection = Selection.Offset(-i).Value
                Exit For
            End If
        Next
End Sub

f:id:Infoment:20190911224707p:plain

参考まで。