[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『区分ごとに並び替え』(前)
お世話になります。 区分ごとの名簿を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.