- ベストアンサー
エクセルでデータを分解して並べなおしたい
A列にある単語データをばらして順不同で B列に並び替えたいのです。 A B teacher a r h t e c e tiger g r i t e table a l t e b 関数の本を見ながらやるのですが、なかなかうまくいきません。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#02です。先に回答したユーザ定義関数(マクロ)では文字数が1文字の時と、セルが空白の時#VALUE!エラーとなりますので、以下に差し替えてください Function StrRnd(ByVal trg As Range) As String Dim wkStr As String Dim ptr As Integer Randomize wkStr = trg.Value Do While Len(wkStr) > 1 ptr = Int(Rnd * Len(wkStr)) + 1 StrRnd = StrRnd & Mid(wkStr, ptr, 1) & " " wkStr = Left(wkStr, ptr - 1) & Right(wkStr, Len(wkStr) - ptr) Loop StrRnd = StrRnd & wkStr End Function
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 ご質問の意図は分かるけれども、関数では、乱数表は、一個の単語ずつでしか出来ないと思います。マクロは、なかなか難しいと思いますね。それは、なによりも、乱数が入るから、乱数の順位を取って、それを、文字列の順位に当てはめるという作業は、かなり複雑な内容になるはずです。 関数で、一つずつ処理する方法です。 まず、一番長い単語の数よりも、右の位置に乱数をおきます。 つまり、その乱数表と単語の間のセル幅を狭くしておきます。 イメージ(分かりにくいかもしれません) A B C D E F G F I J K teacher h e c e r t 7 0.478379949 3 0.147999063 5 0.091289246 6 A1: teacher I1: 7 (文字列の数) J1~適当なところまで、 =RAND() K1~適当なところまで、 =IF(ROW(A1)>$I$1,"",RANK(J1,OFFSET($J$1,,,$I$1))) B1~右に =IF(COLUMN(A1)>=LEN($A$1),"",MID($A1,OFFSET($K$1,COLUMN(A1),0),1)) そうすると、ランダムな文字の並びが出てきます。 それが出てきたら、コピーして、[値貼り付け] をします。値貼り付けボタンをユーザー設定のコマンドから貼り付けてあったほうが便利です。 このようにして、文字列化させたら、2行目も同じようにしていきます。
- kimino_naha
- ベストアンサー率33% (26/78)
No1です 追記 IF文は最大文字数を超える場合にセルを空白にするためのものですが、 MIDB関数の場合必要ありませんでした。 C1 に =MIDB(A1,1,1) D1 に =MIDB(A1,2,1) 以下同じ、失礼しました。 ついでに、文字結合関数のCONCATENATEの変わりに、文字列演算子&も使用できます。 =G1&C1&D1&E1・・・・・・ です。関数の勉強をされているようなので、CONCATENATE関数を紹介しました。 作業列を表示したくない場合は、作業列を選択し、書式、列、表示しないを選んでください。 正確に確認せず回答してすいませんでした。
お礼
No2さんの回答でうまくいきました。 ご親切にご返事ありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
ワークシート関数では難しそうなので、ユーザ定義関数を作ってみました。以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。 VBE画面を閉じてワークシート画面に戻り、B1セルに =StrRnd(A1) と入力すると、A1セルの文字をランダムに並べ替えます。 Function StrRnd(ByVal trg As Range) As String Dim wkStr As String Dim ptr As Integer Randomize wkStr = trg.Value Do ptr = Int(Rnd * Len(wkStr)) + 1 StrRnd = StrRnd & Mid(wkStr, ptr, 1) wkStr = Left(wkStr, ptr - 1) & Right(wkStr, Len(wkStr) - ptr) Loop Until Len(wkStr) = 1 StrRnd = StrRnd & wkStr End Function もしB列に格納する文字間に空白を入れたいなら、8行目を以下に変更してください StrRnd = StrRnd & Mid(wkStr, ptr, 1) & " "
- kimino_naha
- ベストアンサー率33% (26/78)
作業列が必要になりますが LENB関数で文字数を求め、MIDB関数で希望する文字を取り出します。 C1 に =IF(LENB(A1)<1,"",MIDB(A1,1,1)) D1 に =IF(LENB(A1)<2,"",MIDB(A1,2,1)) E1 に =IF(LENB(A1)<3,"",MIDB(A1,3,1)) 以下最大文字数まで続けます。 B1 の規則がわからないのですが 文字結合関数のCONCATENATEを使用し B1 に =CONCATENATE(E1,D1,C1・・・) とすればいかがでしょうか。 作業列が作成できない場合は =CONCATENATE(IF(LENB(A1)<3,"",MIDB(A1,3,1)),IF(LENB(A1)<2,"",MIDB(A1,2,1)),・・・) でも可能ですが、修正などを考えると作業列は必要でしょう。
お礼
早速のご回答ありがとうございました。 1回目失敗しましたが、再度、やりなおしで見事に並びました。 自分で考えていたのでは、なかなかここまでできません。 本当に助かりました。ありがとうございました。