- ベストアンサー
VBAで最後に編集したデータにジャンプする方法
- VBAを使用して、特定のワークシートで最後に編集したデータに簡単にジャンプする方法を紹介します。
- すべてのワークシートではなく、特定のワークシートだけを開いた場合に有効な方法です。
- B列には必ずデータがあり、1行目も日付固定で、2行目からデータを入力しています。ただし、B列以外のセルには不定のデータがあります。右端のセルも揃っているわけではありません。データは文字列形式です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
No6の補足です。同じコードを2か所に書くと後々メンテナンスが面倒になるので通常は 標準モジュールに以下のコードを Public Function セル選択() 'Public Sub セル選択()にするとマクロ一覧に出てくるようになる。 Dim BRow As Long Dim LColumn As Long With ActiveSheet BRow = .UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row LColumn = .Cells(BRow, Columns.Count).End(xlToLeft).Column .Cells(BRow, LColumn + 1).Select End With End Function ThisWorkbookモジュールに以下のコードを Private Sub Workbook_Open() If ActiveSheet.Name = "該当シートの名前" Then セル選択 End If End Sub 該当するシートモジュールに以下のコードを記載します。 Private Sub Worksheet_Activate() セル選択 End Sub
その他の回答 (7)
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 3つともおっしゃる通りの場所にコピーペーストしてみましたが、ブックを開いても何も起こりませんでした。ただし、デバッグのステップインではちゃんと最後の行のデータの右にカーソルが合わさります。 セルが最後の行とは限らないわけですから、No7のコードで開いたときに動いたとしても最終行にカーソルが移動しますから、これ以上No7にこだわる必要はありませんが、とりあえず If ActiveSheet.Name = "該当シートの名前" Then この該当シートの名前の部分を本来のあなたのファイルのシート名に書き換えていますか? 実際にあなたが希望している動作としては、セルは最後の行とは限らないということですからNo2のコードが選択肢としてあげられます。No2のコードをNo7のパターンで作成してください。
お礼
本当に何度もすいませんでした。初歩的な事でレスしてもらってすみません。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> No.1のコードではステップイン時では上手くいきますが、ブックを開いた場合はこのマクロが機能せず、最後に編集した箇所にカーソルがいってしまってます。 前回の回答No13と今回のNo1を両方適用してください。 Workbook_Open()とWorksheet_Activate()と同じ内容のものをそれぞれのシートモジュールとして適用です。 > もし最後に編集した箇所が一度値を入れたが、やはり不必要になったので空白にした場合は除きたいです。 式が入っていなければ希望の動作をすると思います。 NO4に書いた「書式設定など利用したセルが現在の最終行より下にあれば云々」は勘違いでしたので忘れてください。数式がない限りデータのある最終行を選択します。
- mt2008
- ベストアンサー率52% (885/1701)
> 1度データを入れたものの、もう1度値を消しブランクセルにしたものは除外としたいです。 値を消してブランクセルにって……どうやってブランクセルにしていますか? もしかしてDeleteやBackSpaceで消しているのではなく、スペースを入力しているのでしょうか?
補足
右クリック→数式と値のクリア です。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> >もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。 > > おっしゃる通り、最後にテータを入れたセルが常に最終行となります。 私の言う通りなら「最後にデータを入れたセルが最終行でないこともある 」になるのですが… 後半に書かれているように常に最終行ということでしたら、No1のコードで実現できるはずですが試してみましたか? ただし、前回書いたように、一度でも書式設定など利用したセルが現在の最終行より下にあれば、その行まで認識してしまうというエクセルの仕様があるので、その部分に関しては注意が必要です。
補足
>私の言う通りなら「最後にデータを入れたセルが最終行でないこともある 」になるのですが… 錯誤させてしまい申し訳ありません。セルが最終行「でないこともある 」が正しいです。 本当にすいません。
- mt2008
- ベストアンサー率52% (885/1701)
シートを選択した時で良いのでしたらSheetモジュールに↓でどうでしょう? Private Sub Worksheet_Activate() nRow = Cells(Rows.Count, 2).End(xlUp).Row 'B列の一番下の行 nCol = Cells(nRow, Columns.Count).End(xlToLeft).Column 'B列の一番下の行の一番右の列 Cells(nRow, nCol + 1).Select '一つ隣りを選択 End Sub
補足
回答有難うございます。 大変申し訳ないですが、前回にもある通り、 1度データを入れたものの、もう1度値を消しブランクセルにしたものは除外としたいです。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1です もし、最後にデータを入れるのが最後の行ではなくてどの行に入力するかが不定で、どの行であろうと最後にデータを入力したセルの右隣を選択したいということでしたら、とりあえず別シートに最後に入力したセル番地を記載しておき、該当シートをアクティブにしたときにその記載しているセル番地の右を選択状態にするという手もあります。ただし、最後に必ず保存しなくてはいけませんが。 以下のコードはSheet2に記載するようにしてます。一番最初に何も入力しないままに該当シートをアクティブにした場合エラーになるので、Sheet2のA1にデータがない場合、セルの選択実行はしません。 Private Sub Worksheet_Activate() If Sheets("Sheet2").Range("A1").Value <> "" Then Range(Sheets("Sheet2").Range("A1")).Offset(0, 1).Select End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Range("A1").Value = Target.Address End Sub
お礼
補足ですが、No.1のコードではステップイン時では上手くいきますが、ブックを開いた場合はこのマクロが機能せず、最後に編集した箇所にカーソルがいってしまってます。もし最後に編集した箇所が一度値を入れたが、やはり不必要になったので空白にした場合は除きたいです。
補足
補足への返事が遅くなったため、回答させてしまい申し訳ないです。
- kkkkkm
- ベストアンサー率66% (1719/2589)
URLの部分がIE11だと括弧も認識して前回の質問にうまく飛ばないのでこちらに書き直しておきますね。 http://okwave.jp/qa/q8795572.html 上記の質問のNo13のコードを該当シートモジュールに対応させても駄目だったでしょうか Private Sub Worksheet_Activate() Dim BRow As Long Dim LColumn As Long With ActiveSheet BRow = .UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row LColumn = .Cells(BRow, Columns.Count).End(xlToLeft).Column .Cells(BRow, LColumn + 1).Select End With End Sub もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。
お礼
大変返事が遅くなりました。前回からの引き続きの回答有難うございます。
補足
>もしかして、最後にデータを入れたセルというのが最終行とは限らないということでしょうか。 おっしゃる通り、最後にテータを入れたセルが常に最終行となります。
お礼
3つともおっしゃる通りの場所にコピーペーストしてみましたが、ブックを開いても何も起こりませんでした。ただし、デバッグのステップインではちゃんと最後の行のデータの右にカーソルが合わさります。
補足
後々の事まで考慮して頂いて有難うございます。