[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『区分ごとに並び替え』(前)
お世話になります。 区分ごとの名簿をD列の集計列に区分1、区分2、区分3の順番で並べるにはどうすれば良いですか?
A B C D
1 区分1 区分2 区分3 集計
2 a c e a
3 b d f b
4 c
d
e
f
また、下のように区分1に"g"が追加されたら集計列もbとcの間に入るようにしたいです。
A B C D
1 区分1 区分2 区分3 集計
2 a c e a
3 b d f b
4 g g
c
d
e
f
よろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
掟破りのユーザー定義関数! ちょっと多めに範囲を選択して、
表示する時もちょっと多めに範囲を選択した状態でCtrl+Shift+Enterで確定します。 一応↓こんな感じになりました(^^;
=集計(A2:C7) 区分1 区分2 区分3 集計 a c e a a =集計(A2:C7) b d f b b g ア D社 c g f d c e d f ア f e f D社 #N/A #N/A #N/A #N/A #N/A
Option Explicit
Function 集計(ByVal 範囲 As Range) As Variant
Dim MyA As Variant
Dim MyAry() As Variant
Dim i As Long
Dim j As Long
Dim k As Long
MyA = 範囲.Value
For j = LBound(MyA, 2) To UBound(MyA, 2)
For i = LBound(MyA, 1) To UBound(MyA, 1)
If MyA(i, j) <> "" Then
k = k + 1
ReDim Preserve MyAry(1 To k)
MyAry(k) = MyA(i, j)
End If
Next
Next
集計 = Application.Transpose(MyAry)
End Function
そりゃないぜ!セニョーラ!セニョリータ! v(=∩_∩=)v (SoulMan) 2018/12/29(土) 14:07
こんにちは ^^ めっちゃ力わざですけど。。。VBA シート2も作業でつかいましたので。。。まるごとふっとびます(消える)^^; buf2の初期化は無駄かもですが(。。。用心の為 A^_^;) 新規BOOKでお試しを
Option Explicit
Sub main()
Dim s1 As Worksheet
Dim s2 As Worksheet
Dim buf
Dim buf2()
Dim rr As Range
Dim r As Range
Dim y As Long
Dim i As Long
Dim j As Long
Set s1 = Worksheets("Sheet1")
Set s2 = Worksheets("Sheet2")
s1.Columns(4).SpecialCells(2).Clear
s2.UsedRange.Delete
s1.UsedRange.Copy s2.Range("A1")
s1.Columns(4).Cells(1) = "集計"
With s2
y = 2
.Rows(1).Delete
Set rr = s2.UsedRange
For Each r In rr.Columns
Debug.Print r.Address
buf = r.SpecialCells(xlCellTypeVisible)
If TypeName(buf) = "Variant()" Then
For i = 1 To UBound(buf, 1)
If buf(i, 1) <> "" Then
ReDim Preserve buf2(j)
buf2(j) = buf(i, 1)
j = j + 1
End If
Next
s1.Cells(y, 4).Resize(UBound(buf2) + 1, 1) = WorksheetFunction.Transpose(buf2)
y = y + UBound(buf2) + 1
ElseIf TypeName(buf) = "String" Then
s1.Cells(y, 4) = buf
y = y + 1
End If
j = 0: Erase buf2
Next
End With
End Sub
(隠居じーさん) 2018/12/29(土) 14:38
数式でやろうと思ったんだけど。
tb1 = Application.Transpose(Range("A2", Range("A" & Rows.Count).End(xlUp)).Value)
tb2 = Application.Transpose(Range("B2", Range("B" & Rows.Count).End(xlUp)).Value)
tb3 = Application.Transpose(Range("C2", Range("C" & Rows.Count).End(xlUp)).Value)
tb4 = Split(Join(tb1) & " " & Join(tb2) & " " & Join(tb3))
Range("D2").Resize(UBound(tb4) + 1).Value = Application.Transpose(tb4)
(BJ) 2018/12/29(土) 14:52
うわ〜〜〜マジックナンバー。。。ならぬ マジックコード(わるさはしないと思いますが、余分なものが ^^;)
(隠居じーさん) 2018/12/29(土) 14:38の
Debug.Print r.Address
は消してくださいね m(_ _)m
すみません。 来年はあやまらなくてすむようにしよぉ〜(できないかも)(#^.^#)
( ̄▽ ̄); (隠居じーさん) 2018/12/29(土) 15:17
#N/Aが見苦しい場合は、↓こうすると消えました(^^; 数合わせしてね =IF(COUNTA(集計(A2:C16))<ROW()-1,"",集計(A2:C16))
区分1 区分2 区分3 集計 a c e a a=IF(COUNTA(集計(A2:C16))<ROW()-1,"",集計(A2:C16)) b d f b b g ア D社 c g ss f j d ss y qqq e y o f o o p c d ア f qqq o p e f D社 j (SoulMan) 2018/12/29(土) 15:44
SoulManさんのを少しさわってみました
>ReDim Preserve MyAry(1 To k)
はやめて
MyAry = Evaluate("transpose(if(a1:a" & Application.Caller.Count & "="""","""",""""))")
で、どうでしょうか。
(マナ) 2018/12/29(土) 16:36
こんばんは! ありがとうございます。 入れ物を .Caller.Count で数えるんですね? Niceです。勉強になりました。ありがとうございます。 これなら =集計(A2:C16) だけでいいですね(^^;
↓あってますぅ?
Option Explicit
Function 集計(ByVal 範囲 As Range) As Variant
Dim MyA As Variant
Dim MyAry() As Variant
Dim i As Long
Dim j As Long
Dim k As Long
MyA = 範囲.Value
MyAry = Evaluate("transpose(if(a1:a" & Application.Caller.Count & "="""","""",""""))")
For j = LBound(MyA, 2) To UBound(MyA, 2)
For i = LBound(MyA, 1) To UBound(MyA, 1)
If MyA(i, j) <> "" Then
k = k + 1
MyAry(k) = MyA(i, j)
End If
Next
Next
集計 = Application.Transpose(MyAry)
End Function
(SoulMan) 2018/12/29(土) 17:04
で、私風に書くと、、、
Option Explicit
Function 集計(ByVal 範囲 As Range) As Variant
Dim MyA As Variant
Dim MyAry() As String
Dim i As Long
Dim j As Long
Dim k As Long
MyA = 範囲.Value
ReDim MyAry(1 To Application.Caller.Count)
'MyAry = Evaluate("transpose(if(a1:a" & Application.Caller.Count & "="""","""",""""))")
For j = LBound(MyA, 2) To UBound(MyA, 2)
For i = LBound(MyA, 1) To UBound(MyA, 1)
If MyA(i, j) <> "" Then
k = k + 1
MyAry(k) = MyA(i, j)
End If
Next
Next
集計 = Application.Transpose(MyAry)
End Function
(SoulMan) 2018/12/29(土) 17:24
(マナ) 2018/12/29(土) 17:51
そうですね(^^; 私も Caller.Count を失念しておりました。 大変勉強になりました。 ありがとうございます。 これからもよろしくお願いします。 (SoulMan) 2018/12/29(土) 18:13
大変遅くなり申し訳ございません。 皆様ありがとうございます。ユーザー定義関数の知識がなく、最初は ? でしたが、無事再現出来ました。SoulManさんありがとうございました。
ひとつだけ、BJさんのコードはどこに入力すれば良いのでしょうか?シートモジュールと標準モジュールにそれぞれ入れてみましたが、どうすれば動くのかわかりません。 申し訳ございませんがご教授お願いします。 (前) 2018/12/30(日) 11:36
標準モジュール
sub ・・・・ end sub は、書いてません。 (コピペでポンコードは、あまり書かないので、ほぼコピペでポンコードだけど)
(BJ) 2018/12/30(日) 12:36
ありがとうございます。VBAでしたら当たり前のことでした。 失礼しました。 (前) 2018/12/30(日) 12:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.