[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセル関数での複雑な文字列処理について』(エクする?)
エクセル関数を使った文字列の処理についてアドバイスください。
A B C 1 チーム名 指数(1) 指数(2) 2 ホリーズ 1 4 3 バーズ 2 2 4 アニマルズ 1 3 5 キンクス 1 1 6 ラトルズ 2 1 7 カン 1 2
という表があったときに、関数を使って指数(1)ごとの該当チーム名を別表にして下に表したいのです。このとき、該当のチーム名を1セル内に(できればコンマでつないで)下表のように横並びにしたいのです。
10 指数(1) チーム名 11 1 ホリーズ, アニマルズ, キンクス, カン 12 2 バーズ, ラトルズ
もうひとつ欲を言えば、下のようにチーム名を指標(3)の順番に並び替えられればベストです。
10 指数(1) チーム名 11 1 キンクス, カン, アニマルズ, ホリーズ 12 2 ラトルズ, バーズ
私が試したのは下記のやり方で、
=IF(B2=1,A2&", ","")&IF(B3=1,A3&", ","")&IF(B4=1,A4&", ","")&IF(B5=1,A5&", ","")&......
という具合にIFと演算子&を使ってある程度は対応できたのですが、指標(2)での並べ替えには全く対応できませんし、入力できる数式に文字数制限があり、この場合だと約40チーム分までしか処理できません。A列には最大で1008チームは入るようにしたいと考えており、きっと何かスマートな解決法があるのでは、とは思うのですが・・・なかなかそこに辿り着けないでいます。配列数式も試みましたが、文字列をどう扱っていいのかわからず・・・。
マクロ等は用いずなるべく関数で、しかも1シート内で収まればベストです。
アドバイスお待ちしてます。
こんにちは〜♪
まず、 >該当のチーム名を1セル内に(できればコンマでつないで) >ホリーズ, アニマルズ, キンクス, カン
というのが、関数ではむずかしいんですヨ〜!!。。。 一旦、別々のセルへ抽出して & で繋ぐ方法もありますが。。。
>列には最大で1008チーム
データ数が1008行。。
指数(1) (2) はいくつあるのでしょうか?
おなじ指数で最大、何チームくらいでしょう?
これが多いと、チョット大変かな〜。。。
考えてみますけれど VBA向きと思います。。
。。。Ms.Rin〜♪♪
A B C D E 10 指数(1) チーム名 11 1 ホリーズ アニマルズ キンクス カン 12 2 バーズ ラトルズ
別セルに並べるなら(上記) 関数でも
もしくは上記を他のセルで表記して
&でつなぐなら
jjjet
。。。Ms.Rin〜♪♪さん
早速のレスありがとうございます。
>指数(1) (2) はいくつあるのでしょうか?
指数(1)は最大64、指数(2)は上限未設定ですが暫定で32(恐らくはこれを上回らないでしょう)です。
>おなじ指数で最大、何チームくらいでしょう?
これは32です。
>VBA向きと思います
VBAならキレイに処理できるのであれば、
それも検討するかもしれないです。
回答でなくてすみません。 マルチポストをしている場合はあらかじめどこそことマルチポストしていると書いておいた方がいいですよ。
http://pasokoma.jp/45/lg452018
(独覚)
おじゃまします。 関数は分からない kanabun です。
ま、とりあえず、表をソート。 優先順位[B]列、[C]列の順で並び替えると、↓のようになり、
[A] [B] [C] [D] [1] チーム名 指数(1) 指数(2) (元の並び) [2] キンクス 1 1 4 [3] カン 1 2 6 [4] アニマルズ 1 3 3 [5] ホリーズ 1 4 1 [6] ラトルズ 2 1 5 [7] バーズ 2 2 2
こうしておいて、 B列に 1, 2, ... とオートフィルタをかけると、 A列の表示セルが1か所にまとまりますデス、ハイ(^^。
このあたりからは、つい、マクロでやることしか考え付きません(^^ '-------- Dim c As Range With Sheet1.[A1].CurrentRegion For Each c In Sheet2.[A2:A3] .AutoFilter 2, c.Value c.Offset(, 1).Value = Join( _ Application.Transpose(Sheet1.[A2:A7].SpecialCells(xlVisible)), ",") Next .AutoFilter End With '--------
[Sheet2]
指数(1) チーム名 1 キンクス,カン,アニマルズ,ホリーズ 2 ラトルズ,バーズ
(kanabun)
ふたたび〜です。。。♪
関数ならこんな表です。。。
┌─┬─────┬────┬────┬─────┬────┬─────────────────┬────┬─────┬─────┬──────┬──────┐ │ │ A │ B │ C │ D │ E │ F │ G │ H │ I │ J │ K │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 1│チーム名 │指数(1) │指数(2) │作業列 │ │キンクス,カン,アニマルズ,ホリーズ │ 1│キンクス, │カン, │アニマルズ, │ホリーズ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 2│ホリーズ │ 1│ 4│ 100004│ │ラトルズ,バーズ │ 2│ラトルズ, │バーズ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 3│バーズ │ 2│ 2│ 200002│ │ │ │ │ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 4│アニマルズ│ 1│ 3│ 100003│ │ │ │ │ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 5│キンクス │ 1│ 1│ 100001│ │ │ │ │ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 6│ラトルズ │ 2│ 1│ 200001│ │ │ │ │ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 7│カン │ 1│ 2│ 100002│ │ │ │ │ │ │ │ ├─┼─────┼────┼────┼─────┼────┼─────────────────┼────┼─────┼─────┼──────┼──────┤ │ 8│ │ │ │ │ │ │ │ │ │ │ │ └─┴─────┴────┴────┴─────┴────┴─────────────────┴────┴─────┴─────┴──────┴──────┘
★D列に、作業列を作ります。。。
D2セルへ =B2*10^5+C2 下へコピー。。。
★G列へ 指数(1)を入力しておきます。。。
★H1セルへ =IF(COUNTIF($B:$B,$G1)<COLUMN(A1),"", INDEX($A:$A,MATCH(10^5*$G1+COLUMN(A1),$D:$D,0))&REPT(",",COUNTIF($B:$B,$G1)>COLUMN(A1)))
右と下へコピー。。。
↑の式は、配列数式ではないので、そんなに重たくないと思います。。。
★F列で、チーム名を繋ぎます。。
F1セルへ =H1&I1&J1&K1&L1 下へコピー。。。
ご参考にどうぞ。。。
。。。Ms.Rin〜♪♪
。。。Ms.Rin〜♪♪さん
ありがとうございます。教えていただいたやり方で何とかできそうです。 ただ、まだH1の数式の意味が理解できないので、もう少し勉強します・・・。
(エクする?)
もう解決済みとは思いますが、、、 指数(1)や指数(2)が数値で連番になっていて、間違っていない事が前提ですが こんなのはいかがでしょう? Sub Test() Dim MyA As Variant, x() As Variant Dim i As Long With Worksheets("Sheet1") MyA = .Range("A2", .Range("C" & .Rows.Count).End(xlUp)) ReDim x(1 To WorksheetFunction.Max(.Range("B:B")), 1 To .Columns.Count) End With For i = 1 To UBound(MyA, 1) x(MyA(i, 2), 1) = MyA(i, 2) x(MyA(i, 2), MyA(i, 3) + 1) = MyA(i, 1) Next i With Worksheets("Sheet2") .Cells.ClearContents .Range("A1:B1") = [{"指数(1)","チーム名"}] .Range("A2").Resize(UBound(x, 1), UBound(x, 2)) = x() End With End Sub (キリキ)(〃⌒o⌒)b
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.