重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

添付画像のように
表に対して、
①順位を基準に昇順に並び替え
②表内で特定の列の背景色を変更
 (例えば…a支店、佐藤、東京、埼玉、千葉、福岡を含む列の背景色を赤色に変更)
となるようなVBAを作りたいのですが、バラバラの表をうまく選択して処理していく方法が思いつきません。(表もA列から始まるとは限らない。)
どのような記述法が考えられるでしょうか?

「飛び飛びになった表の並び替え&特定の列の」の質問画像

A 回答 (9件)

Sub test()


Dim rg As Range, ur As Range, fc As Range
Set ur = UsedRange
Set rg = ur.Find("順位", ur.Item(ur.Count))
Set fc = rg
Do While Not rg Is Nothing
MsgBox Range(rg, rg.End(xlToRight).End(xlDown)).Address
Set rg = ur.FindNext(rg)
If rg.Address = fc.Address Then Exit Do
Loop
End Sub

これで領域化があっているなら
このmsgboxで使った領域を用いて
SUB を呼び出して加工すれば如何でしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
領域化はほぼ正しく選択されていましたが
順位がないところもあってその場合は並び替えなかったり、
合計のところは範囲から除外するのでちょっと工夫する必要がありますが
とても参考になります。

とりあえず自分で端から最大列行まで1個ずつ見ていくやり方でなんとか作りましたが、
当たり前ですが処理が重たいのでこの領域指定を参考にして書きなおそうと思います

お礼日時:2017/03/20 17:26

No.8です。



>シートには結合セルがつかわれていて結合を解除しないとエラーが出ました。

行の途中で結合セルがあると「並び替え」の時にエラーになるはずです。
そのため前回のコードは画像のA1~C4セルのように
最終行だけ結合があっても対応できるコードにしていました。

結合セルを解除してマクロを実行されたというコトですので、
少しコードに手を加えました。(★の行だけです)

Sub Sample2()
Dim myStr As String, c As Range
Dim myS As Long, endRow As Long, endCol As Long
Dim myFound As Range, myFirst As Range
Dim myRng As Range, myArea As Range

myStr = "a支店、佐藤、東京、埼玉、千葉、福岡"
Set myFound = Cells.Find(what:="順位", LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then '//←念のため//
Set myFirst = myFound
GoTo 処理
Do
Set myFound = Cells.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
GoTo 処理
処理:
Set myRng = myFound.CurrentRegion
myS = myFound.Row + 1
endRow = myRng(myRng.Count).Row
If Cells(endRow, myFound.Column).MergeCells Then
endRow = endRow - 1
End If
endCol = myRng(myRng.Count).Column
Set myArea = Range(Cells(myS, myFound.Column), Cells(endRow, endCol))
myArea.Sort key1:=myArea(1), order1:=xlAscending, Header:=xlNo
For Each c In myArea
If c <> "" And InStr(myStr, c) > 0 Then '//←少し条件を追加★//
Range(Cells(c.Row, myFound.Column), Cells(c.Row, endCol)).Interior.ColorIndex = 3
End If
Next c
Loop
End If
End Sub

上記のマクロを実行すると
画像のように左側の表が右側の表のようになりました。

こちらではお望みの動きになったと思ったのですが、
お手元の表の具体的なレイアウトが判らないので
まずはこの程度で・・・m(_ _)m
「飛び飛びになった表の並び替え&特定の列の」の回答画像9
    • good
    • 0

こんばんは!



一例です。
各表は隣接していない!という前提です。
(表と表の間は必ず1列・1行以上離れている)

Sub Sample1()
Dim myEnd As Long, myStr As String, c As Range
Dim myS As Long, endRow As Long, endCol As Long
Dim myFound As Range, myFirst As Range
Dim myRng As Range, myArea As Range

myStr = "a支店、佐藤、東京、埼玉、千葉、福岡"
Set myFound = Cells.Find(what:="順位", LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then '//←念のため//
Set myFirst = myFound
GoTo 処理
Do
Set myFound = Cells.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
GoTo 処理
処理:
Set myRng = myFound.CurrentRegion
myS = myFound.Row + 1
endRow = myRng(myRng.Count).Row
If Cells(endRow, myFound.Column).MergeCells Then
endRow = endRow - 1
End If
endCol = myRng(myRng.Count).Column
Set myArea = Range(Cells(myS, myFound.Column), Cells(endRow, endCol))
myArea.Sort key1:=myArea(1), order1:=xlAscending, Header:=xlNo
For Each c In myArea
If InStr(myStr, c) > 0 Then
Range(Cells(c.Row, myFound.Column), Cells(c.Row, endCol)).Interior.ColorIndex = 3
End If
Next c
Loop
End If
End Sub


こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

シートには結合セルがつかわれていて結合を解除しないとエラーが出ました。
また結合を解除して使うと、セルの参照がずれて表がおかしくなり処理自体も
If InStr(myStr, c) > 0 Then で型が一致しないと言われエラーとなりました。。。

お礼日時:2017/03/20 17:49

条件付き書式だけといったが


条件付き書式が案外ややこしかったので
追記しておきます。

まずa支店、佐藤、東京、埼玉、千葉、福岡の
候補をどこかのシートで縦に並べて
名前定義しておきます。(仮に今回は着目って名前にしました)
(候補数が変動するなら名前定義 可変領域で検索して
追随する式に変更してください)

それが表の2列目にあるものという前提で
表が仮にE1:H10の場合
そこを選択して条件付き書式で

数式を使用して書式設定するセルを決定を選び

=MATCH(OFFSET(A1,0,6-COLUMN(A1)),着目,0)

書式は塗りつぶしの赤です。
途中の6が表の始まり列+1の数字になります。

VBAではマクロの記録で上記操作をして
そこを選択してというのはSELECT不要なので
Selection の所にSubへの引数である
msgboxが指していた領域を用います。
次に数式の6の部分のみ領域のRange変数名に続けて
.Columns(2).column
とすればA列からの時は2、E列の時は6になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

実際の作業で塗りつぶさせたい候補がたくさんあったので
条件式書式は使わず、塗りつぶしたい候補を配列にいれて
配列内のデータと一致する行の背景色を変更させる方法を取りました。

お礼日時:2017/03/20 17:31

>表もA列から始まるとは限らない。

・・・とのことですが、
本件、表の位置を決めてしまうのが、本来の解決法かと思いますが、
表の列を決められない理由は何でしょうか。
その理由、背景等が判れば、別の解決法が見つかるかもしれません。
    • good
    • 0
この回答へのお礼

表の位置を決められないのは表は別のシートで作られているもので、
複数シートに渡り、ばらばらにつくられている為、すべてに対応できるようにさせたいからです。

お礼日時:2017/03/20 17:28

>選択範囲を拡張して昇順ソート


拡張は要らないですね。
領域は指定済だから。

基本選択(Select)もほとんど要らないです。
手で操作すると選択しなきゃ勿論操作できないけど
マクロの記録はSelectionにその時の選択セルを
書けば成り立つ場合が多いです。
その場合直前のSELECTが無用ということで。
    • good
    • 0

あ、失礼しました。

右上の表以外変わってない気がしたもので、N2~8の例のみ出しましたが、どちみち範囲が列全体になっているので失敗ですね。
N2~8であれば=SMALL(E$2:E$8,ROW()-ROW(N$1))とするべきでした。
左下の表も変わっているし、左上・右下の表はたまたま変わっていないだけで、順位どおりに並べているわけですね。
E$2:E$8とN$1をそれぞれ該当する範囲・タイトル行にすれば対応できます。
『順位』と表示されているセルを基準として考えると分かり易いかと。
    • good
    • 0
この回答へのお礼

回答ありがとございます。
表は実際には複数シートにまたがり、また位置も大きさもバラバラだったので
並び替えたい範囲を条件式によって端から選択させて逐一並び替える事でうまく行きました。

お礼日時:2017/03/20 17:15

VBAの式は分からないので、関数によって別のセルに表示させる場合を説明します。


関数でできることは同様にしてVBAでできるのだろうと思いますので、考え方の参考まで。

並び替え
同順位があるようですので、作業列を用いてIDを割り振ります。
ID=順位&"-"&その順位がそのセルで何回目か(同着が無い場合は必ず-1、同着があれば上から順に-1,-2…)
N2~8はSMALL(E:E,ROW()-1)とすることで、その行に表示する順位を算出させます。
作業列を用いてIDに変換します。検索用のIDの計算については、先ほどのIDと同様です。
MATCHを使って検索用のIDと一致するIDの行番号を取得します。
INDIRECTと取得したいデータの列名、取得した行番号、を用いて、検索用IDと一致する行の県・件数・合計を表示します。

これによって並び替えは完了です。

セルに色をつけるのは条件付書式で可能かと思われます。
    • good
    • 0

(表もA列から始まるとは限らない。


この時点で、じゃあどうやって見つけるのかを書かずに
プログラムに出来ると考えてはるんでしょうか?

プログラムは指示した通りのことはやりますが
指示もしないことを自発的にしたりしません。

しかも、内容はソートと条件付き書式だけなので
マクロ記録できるし、後はその領域の決め方を
コードにするだけです。

その肝心の領域の決め方を記述せずに
どうすることもできません。
    • good
    • 0
この回答へのお礼

その領域の決め方の記述法に苦戦している感じです。
今考えてるのは
①:"順位"と書かれているセルの位置を上から調べて検索し変数に入れる
②:①で調べたした位置から下、数字(順位の数字)が入っている範囲を選択
③:選択範囲を拡張して昇順ソート
④:次の”順位”の位置を検索
という感じで行けばと思ってますが…

お礼日時:2017/03/19 17:47

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