
表を時間(C1)の降順にて並び替えたいです
表は、つど、サイズが違います
開始行の項目はA1からH1やI1やK1などに変化します
行の数も、その都度、少なかったり多かったりします
この場合の、表全体を範囲する場合にはどんな方法あがありますか?
教えて下さい
なお、A1の以下、コードでも、ソートされている感じはあります
【条件】
A列とC列と開始行に歯抜けデータはないです
【コード】
Sub test()
Range("A1").Sort Key1:=Range("c1"), order1:=xlDescending, Header:=xlYes
End Sub
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
コメント拝見しました。
私の読み取り方が勘違いしてたみたいですね。
表の範囲において、
・A列は歯抜けなし
・1行目は項目行で最後列まで歯抜けなし
ということであれば、これでもいいのかな。
Sub SortByOffsetColumnFromA1()
Dim baseCell As Range ' 基準セル(A1)
Dim tblRange As Range ' 表の範囲(CurrentRegionで取得)
Dim keyColumn As Range ' ソートのキーとなる列(C列)
Dim keyColIndex As Long ' 表内での列番号(相対)
Set baseCell = Range("A1") ' A1セルを基準にする
Set tblRange = baseCell.CurrentRegion ' A1を含む表の範囲を取得
keyColIndex = 3 ' 表内の3列目(C列)をソートキーに設定
Set keyColumn = tblRange.Columns(keyColIndex)
' ソート実行:降順、ヘッダーあり(1行目は見出しとして扱う)
tblRange.Sort Key1:=keyColumn, Order1:=xlDescending, Header:=xlYes
End Sub
先の回答ではソート昇順にしてました。すみません。
No.3
- 回答日時:
こういう問題は得意(システム屋だった)なのですが、歳を取って今期が無いのでAIに聞きました。
以下はGoogleGeminiの回答です。承知いたしました。表のサイズが変動し、開始行の項目も変わる可能性があるのですね。A列とC列、そして開始行に歯抜けデータがないという条件を考慮して、表全体を自動的に範囲指定し、C列を降順に並べ替える方法をいくつかご提案します。
方法1:CurrentRegionプロパティを利用する
CurrentRegionプロパティは、選択したセルを含む、空白行と空白列で囲まれた領域全体を取得します。このプロパティを利用すると、表のサイズが変動しても自動的に範囲を認識できます。
Sub SortByCTimeDescending()
Dim targetRange As Range
' A1セルを基準にCurrentRegionで表全体を取得
Set targetRange = Range("A1").CurrentRegion
' C列を降順にソート
targetRange.Sort Key1:=targetRange.Columns("C"), Order1:=xlDescending, Header:=xlYes
End Sub
このコードでは、まず Range("A1").CurrentRegion でA1セルを含む表全体を targetRange に設定しています。その後、targetRange.Sort メソッドでソートを実行しています。Key1 には targetRange.Columns("C") を指定することで、表のC列全体を参照し、Header:=xlYes は1行目をヘッダーとして扱います。
方法2:最終行と最終列から範囲を特定する
Cells.SpecialCells(xlLastCell) を利用してシートの最終セルを特定し、そこから表の左上隅であるA1セルを基準に範囲を取得する方法です。
Sub SortByCTimeDescending_LastCell()
Dim lastRow As Long
Dim lastColumn As Long
Dim targetRange As Range
' シートの最終セルを取得
On Error Resume Next ' データがない場合にエラーを回避
lastRow = Cells.SpecialCells(xlLastCell).Row
lastColumn = Cells.SpecialCells(xlLastCell).Column
On Error GoTo 0 ' エラー処理を元に戻す
' A1セルから最終行・最終列までの範囲を設定
Set targetRange = Range(Cells(1, 1), Cells(lastRow, lastColumn))
' C列を降順にソート
targetRange.Sort Key1:=targetRange.Columns("C"), Order1:=xlDescending, Header:=xlYes
End Sub
この方法では、Cells.SpecialCells(xlLastCell) でシートで使用されている最後のセルを取得し、その行番号と列番号を lastRow と lastColumn に格納します。その後、Range(Cells(1, 1), Cells(lastRow, lastColumn)) でA1セルから最終セルまでの範囲を targetRange に設定しています。
方法3:A列の最終行から範囲を特定する
A列には必ずデータが存在するという条件を利用して、A列の最終行を特定し、そこから表の範囲を推測する方法です。
Sub SortByCTimeDescending_LastRowA()
Dim lastRowA As Long
Dim targetRange As Range
' A列の最終行を取得
lastRowA = Cells(Rows.Count, "A").End(xlUp).Row
' A1セルからA列の最終行までの範囲を基準にCurrentRegionを取得
Set targetRange = Range("A1:A" & lastRowA).CurrentRegion
' C列を降順にソート
targetRange.Sort Key1:=targetRange.Columns("C"), Order1:=xlDescending, Header:=xlYes
End Sub
このコードでは、Cells(Rows.Count, "A").End(xlUp).Row でA列の最終行を取得し、lastRowA に格納します。その後、Range("A1:A" & lastRowA).CurrentRegion でA1セルからA列の最終行までの範囲を含む CurrentRegion を取得し、targetRange に設定しています。
どの方法が良いか
・方法1 (CurrentRegion):表が連続したデータで構成されている場合に最も簡潔で有効です。表の周囲に完全に空白の行と列がある場合に適しています。
・方法2 (最終セル):シート全体で使用されている最後のセルを基準とするため、表以外にもデータが存在する場合、意図しない範囲まで選択される可能性があります。
・方法3 (A列の最終行):A列を基準に表の範囲を推測するため、表がA列から始まっており、途中に空白行がない場合に有効です。
通常は 方法1 (CurrentRegion) が最も柔軟で使いやすいかと思います。もし、表の周囲に空白行や空白列がない場合や、他のデータと隣接している場合は、方法3 (A列の最終行) を試してみるのが良いかもしれません。
ご自身のデータ構造に合わせて、いずれかの方法をお試しください。もし、うまくいかない場合や、さらに詳細な条件があれば、お気軽にお知らせください。
No.2
- 回答日時:
> 開始行の項目はA1からH1やI1やK1などに変化します
表の左上にあたるセルがA1だったり、H1になったりするということですか?
『開始"列"が変化する』ということ
そして、ソートの基準となるのは、「開始列+2」の列となるのでしょうか?
とりあえず、のコード。
選択されているセルを基準としてCurrentRegionで表の範囲を取得し、
選択セルから2つ右の列を基準としてソートします。
Sub SortByOffsetColumn()
Dim baseCell As Range ' アクティブなセル
Dim tblRange As Range ' 表全体の範囲(currentRegionで取得)
Dim keyColumn As Range ' ソートの基準となる列
Dim colOffset As Long ' アクティブセルからの列オフセット(+2列)
On Error GoTo ErrorHandler ' エラーが出たらエラーメッセージを表示
Set baseCell = activeCell ' 現在選択中のセルを取得
Set tblRange = baseCell.CurrentRegion ' 表の範囲(周囲の空白で囲まれた範囲)を取得
colOffset = baseCell.Column - tblRange.Columns(1).Column + 3 ' アクティブセルから+2列目の列番号を計算
' 指定した列が表の範囲外であれば中止
If colOffset > tblRange.Columns.Count Then
MsgBox "右に2列進んだ列が表の範囲にありません。", vbExclamation
Exit Sub
End If
Set keyColumn = tblRange.Columns(colOffset) ' ソートキーとなる列を取得
' ソート実行:ヘッダーあり、昇順で行単位に並び替え
tblRange.Sort Key1:=keyColumn, Order1:=xlAscending, Header:=xlYes
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbCritical
End Sub
コメントはAIに「初心者でもわかるように入れて」と指示して入れてます。
お返事ありがとうございます
すいません。
範囲はA1からH1、A1からI1、AIからK1という意味です
降順の列はC1のみです
> 開始行の項目はA1からH1やI1やK1などに変化します
No.1
- 回答日時:
こんにちは
B列にもデータがあるのなら、CurrentRegionで取得するのが簡単かも知れません。(データ範囲の識別条件にもよりますが・・)
Range("A1").CurrentRegion
データ群の範囲を決める規則が不明ですが、普通に、最終行・最終列を求める方法の応用でも可能でしょう。(こちらの方が正確な場合が多いと思われます)
お返事ありがとうございます
範囲はA1からH1、A1からI1、AIからK1という意味です
降順の列はC1のみです
Range("A1").CurrentRegion ですね。ありがとうございます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】条件付き書式設定をマクロ化するには? 3 2025/03/13 07:53
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2024/06/13 13:39
- Excel(エクセル) 【マクロ】1つのセルから結合されているセルへのコピー貼り付けについて 4 2024/01/28 21:30
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Excel(エクセル) VBA 1 2023/04/27 13:37
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) ExcelのVBAのことで質問です。 以下のコードを入れ、ボタンを押せば作動させると写真のように画面 3 2023/12/14 16:10
- Visual Basic(VBA) Excelのマクロについて教えてください。 2 2024/06/14 16:38
- Visual Basic(VBA) chatGPTで質問してみた エクセルのVBAについて 2 2023/10/24 07:37
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
このQ&Aを見た人はこんなQ&Aも見ています
-
【マクロ】開いているブックの名前を取得した後、名前をセルに1つづつ入力するには?
Visual Basic(VBA)
-
【マクロ】変数を使った、文字の種類の変更にて、エラーとなる。
Visual Basic(VBA)
-
特定のセルだけ結果がおかしいです。 関数はオートフィルでコピーしており、細かく見てもどこもおかしくあ
Excel(エクセル)
-
-
4
エクセルVBA 検索結果を隣のシートの最終行に転記したい。
Visual Basic(VBA)
-
5
エクセルの改行について
Visual Basic(VBA)
-
6
ユーザーマクロ作成
Excel(エクセル)
-
7
エクセルのマクロについて教えてください。
Visual Basic(VBA)
-
8
算術演算子「¥」の意味について
Visual Basic(VBA)
-
9
【マクロ】参照渡しとモジュールレベル変数 どっちが よく使うものですか?
Excel(エクセル)
-
10
VBAの「To」という語句について
Visual Basic(VBA)
-
11
ダブルクリックで貼り付けた画像からリンクのみ削除し、画像を残したい。
Visual Basic(VBA)
-
12
以下のプログラムの実行結果はどうなると思いますか? その理由も教えてください。
Visual Basic(VBA)
-
13
vbsでのwebフォームへの入力制限?
Visual Basic(VBA)
-
14
エクセルのマクロを記録して即実行したらエラー
Excel(エクセル)
-
15
エクセルのdatedif関数を使って、年齢と月齢を入力しました。 関数を入力して、問題なく使えたので
Excel(エクセル)
-
16
【マクロ】データ移動について代替案(コード)or助言を下さい
Excel(エクセル)
-
17
エクセルのマクロについて教えてください。
Visual Basic(VBA)
-
18
エクセル ドロップダウンリストの絞り込みについて
Excel(エクセル)
-
19
【マクロ】売上一覧YYYYMMDDHHSS.xls形式のブックをファイル名一覧から抽出⇒変数に入れる
Visual Basic(VBA)
-
20
エクセル タブの下のメニューを選択 実行するコード
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで並び替え後にア行...
-
【マクロ】並び替えの範囲が、...
-
Excel2017 フィルタ昇順並びがA...
-
EXCELで日付を比べ3か月以内の...
-
基準日以前のデータを範囲を指...
-
S20.5.3を分解するには(エク...
-
excel / ピポッド 日数を出したい
-
【Excel VBA】指定した行の最大...
-
エクセルの空白セルに書式設定...
-
EXCELの関数で大なり記号を複数...
-
EXCELでデータ並べ替えにの時、...
-
エクセルで日付の後に違う日付...
-
プルダウンに【なし、平均、デ...
-
エクセル VBA 行間隔を飛ばした...
-
オートフィルタ後のデータから...
-
エクセルで行の高さ及び列幅の...
-
行一括削除を早く行う、こんな...
-
エクセルで文字が白くなる
-
エクセルの主軸と第2軸の0を合...
-
エクセルで文字を含む式に、カ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel2017 フィルタ昇順並びがA...
-
エクセルで行の高さ及び列幅の...
-
Excelで並び替え後にア行...
-
【Excel VBA】指定した行の最大...
-
エクセルの時刻のカウントが出...
-
オートフィルタ後のデータから...
-
急ぎ!色のついたセルを非表示...
-
EXCELで日付を比べ3か月以内の...
-
基準日以前のデータを範囲を指...
-
エクセル VBA 行間隔を飛ばした...
-
excel / ピポッド 日数を出したい
-
プルダウンに【なし、平均、デ...
-
マクロで行の高さを設定したい
-
エクセル関数について
-
文字列を比較し、相違するフォ...
-
EXCEL 最終行のデータを他のセ...
-
VBA 複数行の検索及び抽出
-
検索条件に合うセルの個数を数...
-
VBA 配列で型がエラーになります。
-
行の一番右のデータセルと同じ...
おすすめ情報