[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『列方向でRANK』(819)
恐れ入ります。
S列からAJ列の1行目に順位 1,2,3・・・18があり
2行目から数字が有ります。データ数は約55000行あります。
1行目を基準に列方向に worksheet function rank で
データの順位を知りたいのです。
列 S T U V W X Y Z ・・・
75 74 72 73 71 70 68 69 ・・・
処理として
U列 数字右詰 フォントサイズ15
V列 数字左詰 フォントサイズ15
Y列 数字右詰 フォントサイズ15
Z列 数字左詰 フォントサイズ15
下処理としてSからAJ列の2行目から下の数字を中央揃えにする。 ?
私の頭ではどの様に記述してよいか分からず悩んでおります。
皆様の知恵をお貸しいただけないでしょうか?
よろしくお願いいたします。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
1行目の順位と
>1行目を基準に列方向に worksheet function rank で >データの順位を知りたいのです。 って何が違うんですか?
やりたいことがさっぱりわからないです。 (稲葉) 2019/01/10(木) 09:06
RANKと書式にどんな関係があるのかもわからんね。 (GobGob) 2019/01/10(木) 09:12
説明がへたですみません。
worksheet function rankこれは最近そちらのサイトで閲覧したときに載っていたものなので
関係あるのかと思いまして使ってしまいました。忘れて頂いて結構です。
S列からAJ列の1行目に記されている数字は順位でそれに対して
2行目からの数字をを列方向にソートせず上にあるのか下にあるのかを判断出来る様にしたいのです。
その数字が本来の順位(1行目)に対して
上位なら左詰め
下位なら右詰め
他は中央揃え
上司からの無茶振りなのでどういう数字か分かりません。只条件の処理を聞いただけなのですみません。
処理はの可能でしょうか?
(819) 2019/01/10(木) 10:03
数値の順位は昇順での順位か降順での順位かどちらだろうか?
(ねむねむ) 2019/01/10(木) 10:10
条件付き書式で
=RANK(S2,$S2:$AJ2,FALSE)<=S$1
表示形式「文字列」
・数値がでかい = ランク上位 ・同ランク = ランク上位処理
(GobGob) 2019/01/10(木) 10:19
あっ、他ってのがあるのね… 中央揃えには対応してません。 (GobGob) 2019/01/10(木) 10:33
GobGob様
頂いた書式試してみます。
(819) 2019/01/10(木) 10:42
中央揃えは右揃え、左揃えと区別できればいい(&列幅はみな同じ)であれば G/標準___ (_はスペース) でも構わないのでは?
(ねむねむ) 2019/01/10(木) 11:14
よろしくお願いいたします。
(819) 2019/01/10(木) 11:21
S列からAJ列を選択して条件付き書式で 条件1:=AND(ROW()>1,RANK(S1,$S1:$AJ1,0)=S$1) 書式1:ユーザー定義で G/標準____ _はスペース、個数は調節してくれ。 条件2:=AND(ROW()>1,RANK(S1,$S1:$AJ1,0)<S$1) 書式2:文字列 ではどうか? (ねむねむ) 2019/01/10(木) 11:44
5万行の書式を変更するのめんどくさいので、矢印にしちゃいました。
考え方あってます?
Option Explicit
Sub test()
Dim tbl As Variant
Dim w As Variant
Dim i As Long
Dim j As Long
tbl = Range("S2", Cells(Rows.Count, "AJ").End(xlUp)).Value
ReDim w(1 To UBound(tbl, 2))
For i = 1 To UBound(tbl)
For j = 1 To UBound(tbl, 2)
w(j) = tbl(i, j)
Next j
Call bsort(w)
For j = 1 To UBound(tbl, 2)
Select Case True
Case tbl(i, j) = w(j): tbl(i, j) = "→" & tbl(i, j)
Case tbl(i, j) > w(j): tbl(i, j) = "↓" & tbl(i, j)
Case tbl(i, j) < w(j): tbl(i, j) = "↑" & tbl(i, j)
End Select
Next j
Next i
Range("S2", Cells(Rows.Count, "AJ").End(xlUp)).Value = tbl
End Sub
Private Sub bsort(ByRef w As Variant)
Dim i As Long
Dim j As Long
Dim n As Long
For i = LBound(w) To UBound(w)
For j = LBound(w) + 1 To UBound(w) - i + LBound(w)
If w(j) < w(j - 1) Then
n = w(j)
w(j) = w(j - 1)
w(j - 1) = n
End If
Next j
Next i
End Sub
Sub reset()
With Range("S2", Cells(Rows.Count, "AJ").End(xlUp))
.Replace "→", ""
.Replace "↑", ""
.Replace "↓", ""
End With
End Sub
(稲葉) 2019/01/10(木) 11:52
申し訳ございません。
上司に見せたところ却下されました。
以前、条件付き書式で大変だったから却下され
矢印だとなんだか判らないとのコメントでした。
もう一度確認確認の意味で条件を提示します。
S2からAJ2が一つの塊で次が
S3からAJ3
S4からAJ4
S5からAJ5
・
・
・
S55000からAJ55000
これを列方向に降順ソートして並べ替えたいのですが
基のデータは変えられないので順位が異なっている所に
フォントサイズを変え左右に振ると言う事にしたのです。
1行目 2行目…
S列 1 75
T列 2 74
U列 3 71 セル左詰
V列 4 72 セル左詰
W列 5 73 セル右詰
X列 6 69
・
・
・
AJ列 18 50
新たにトピを立てた方が良いのでしょうか?
(819) 2019/01/10(木) 14:04
この程度で新しいスレなんていらんでしょ。 矢印付けた後、矢印をFindで検索して書式変更していくってやりかたで試してみましたけど 5000行でもかなり時間かかったから、5万なんて持つかどうかわからんです。
20分くらい放置してみてください。
Sub reset()
Dim r As Range
Dim f As Range
Dim ff As String
Dim moji As Variant
Dim cnt As Long
With Range("S2", Cells(Rows.Count, "AJ").End(xlUp))
.HorizontalAlignment = xlCenter
For Each moji In Array("↑", "↓")
Range("S2").Activate
Set r = Nothing
cnt = 1
Set r = .Find(moji)
If Not r Is Nothing Then
ff = r.Address
cnt = 1
Set f = r
Do
Set f = .FindNext(f)
If f.Address = ff Then Exit Do
Set r = Union(r, f)
cnt = cnt + 1
If cnt > 500 Then
Call 書式設定(r, moji)
cnt = 1
Set r = f
DoEvents
End If
Loop
If Not r Is Nothing Then Call 書式設定(r, moji)
End If
Next moji
.Replace "→", ""
.Replace "↑", ""
.Replace "↓", ""
End With
End Sub
Sub 書式設定(r As Range, ByVal 矢印 As String)
Select Case 矢印
Case "↑": r.HorizontalAlignment = xlRight
Case "↓": r.HorizontalAlignment = xlLeft
End Select
End Sub
(稲葉) 2019/01/10(木) 15:04
>本来S列には矢印は付かないのですがついてしまいます。 一番最初と(819) 2019/01/10(木) 14:04 ではやることが違うってことですか? 少なくとも、 ~~~~~~~~~~~~~~~~~~~~ではあっていたという認識でいいんですか?
(稲葉) 2019/01/10(木) 16:26
すみません最初にコードを走らせていたは課長が隣にいて緊張して確認を怠っていました。
その後確認でコードを走らせたら違うことに気づきました。
当方の確認ミスで申し訳ございませんでした。
(819) 2019/01/10(木) 17:45
>本来S列には矢印は付かないのですがついてしまいます。 他の回答者もS列に書式設定していますが、そちらも誤りということですか?
仮に書式でやるとしても、文字だけだとわかりにくいので、 左寄せは頭に+ 右寄せは頭に−を付けて、下記のデータでどうなればいいか教えていただけますか? 1)範囲をコピーして、S1に張り付け 2)S列を範囲選択して、セルの区切り位置、スペース 3)加工した結果を、何も装飾せず、コメントに張り付けてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
52 26 69 57 37 52 43 74 79 99 57 81 25 38 81 9 77
45 48 75 34 52 57 76 55 7 30 84 58 45 46 70 27 59 32
75 37 47 68 17 13 83 80 71 13 12 6 55 89 45 69 52 48
(稲葉) 2019/01/10(木) 18:08
>一つ言い忘れが有りました。数値は右肩下がりです。 順番になっていなければ、右肩下がりだろうが関係なくないですか?
あと >本来S列には矢印は付かないのですがついてしまいます。 >(819) 2019/01/10(木) 16:20 この部分がいまだにわかりません。
いただいたデータをもとに、コード直しました。 すべて差し替えてください。 データの1行目(52,26,69・・・)は途中で空白セルがあったので、2行目で検証しました。 基本的な考え方は変わっていません。 一度矢印で目印つけて、あとで(reset)で書式設定する方法です。
これでダメなら、私の手に負えそうにないので、辞退します。
|[R] |[S] |[T] |[U] |[V] |[W] |[X] |[Y] |[Z] |[AA]|[AB]|[AC]|[AD]|[AE]|[AF]|[AG]|[AH]|[AI]|[AJ]
[1]|順位 | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16| 17| 18
[2]|元データ| 45| 48| 75| 34| 52| 57| 76| 55| 7| 30| 84| 58| 45| 46| 70| 27| 59| 32
[3]|稲葉 |−45|−48|+75|−34|−52|−57|+76|+55| −7|−30|+84|+58|+45|+46|+70|−27|+59|+32
[4]|819様 |−45|−48|+75|−34|−52|−57|+76|+55| −7|−30|+84|+58|+45|+46|+70|−27|+59|+32
[5]|Large | 84| 76| 75| 70| 59| 58| 57| 55| 52| 48| 46| 45| 45| 34| 32| 30| 27| 7
[6]|Rank | 12| 10| 3| 14| 9| 7| 2| 8| 18| 16| 1| 6| 12| 11| 4| 17| 5| 15
Option Explicit
Sub test()
Dim tbl As Variant
Dim w() As Long
Dim i As Long
Dim j As Long
tbl = Range("S2", Cells(Rows.Count, "AJ").End(xlUp)).Value
ReDim w(1 To UBound(tbl, 2))
For i = 1 To UBound(tbl)
For j = 1 To UBound(tbl, 2)
w(j) = tbl(i, j)
Next j
Call bsort(w)
For j = 1 To UBound(tbl, 2)
Select Case True
Case tbl(i, j) = w(j): tbl(i, j) = "" & tbl(i, j)
Case tbl(i, j) > w(j): tbl(i, j) = "←" & tbl(i, j)
Case tbl(i, j) < w(j): tbl(i, j) = "→" & tbl(i, j)
End Select
Next j
Next i
Range("S2", Cells(Rows.Count, "AJ").End(xlUp)).Value = tbl
End Sub
Private Sub bsort(ByRef w() As Long)
Dim i As Long
Dim j As Long
Dim n As Long
For i = LBound(w) To UBound(w)
For j = LBound(w) + 1 To UBound(w) - i + LBound(w)
If w(j) > w(j - 1) Then
n = w(j)
w(j) = w(j - 1)
w(j - 1) = n
End If
Next j
Next i
End Sub
Sub reset()
Dim r As Range
Dim f As Range
Dim ff As String
Dim moji As Variant
Dim cnt As Long
With Range("S2", Cells(Rows.Count, "AJ").End(xlUp))
.HorizontalAlignment = xlCenter
For Each moji In Array("←", "→")
Range("S2").Activate
Set r = Nothing
cnt = 1
Set r = .Find(moji)
If Not r Is Nothing Then
ff = r.Address
cnt = 1
Set f = r
Do
Set f = .FindNext(f)
If f.Address = ff Then Exit Do
Set r = Union(r, f)
cnt = cnt + 1
If cnt > 500 Then
Call 書式設定(r, moji)
cnt = 1
Set r = f
DoEvents
End If
Loop
If Not r Is Nothing Then Call 書式設定(r, moji)
End If
Next moji
.Replace "←", ""
.Replace "→", ""
End With
End Sub
Sub 書式設定(r As Range, ByVal 矢印 As String)
Select Case 矢印
Case "→": r.HorizontalAlignment = xlRight
Case "←": r.HorizontalAlignment = xlLeft
End Select
End Sub
(稲葉) 2019/01/11(金) 10:00
残念ながら結果が違いました。
長い時間付き合って頂きありがとうございました。
(819) 2019/01/11(金) 13:48
こちらこそ、お役に立てず申し訳ありません。 (稲葉) 2019/01/11(金) 14:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.