[[20140825092402]] 『文字列の前後入替え』(KAO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列の前後入替え』(KAO)

ほぼあきらめかけていましたが、本欄なら..と思いお尋ねします。
問)
ある列に入力されている文字列を、前後入替えたいのですが..
例)A列−B列
イ−aaa,bbb,ccc → イ−ccc,bbb,aaa
ロ−ddd▼eee,ff → ロ−ff,eee▼ddd
説明)
・時系列的に、備忘録として文字情報(aaa〜ff..)を入力しています
(A列に名前、B列が対照列です)
・文字情報はあらゆる文字種を使用しています
・文字情報の長さは1字〜15字ぐらい?(制限あればいってください)
・文字情報の「区切り」として「,」と「▼」を使用しています
・対象は現在1万行近くあります
・文字情報、対象行も時系列で増えていきますので、制限あるようなら
 提示ください

できれば関数式希望ですが、マクロであれば簡単な説明を付けていただくと
助かります。(マクロ記録がやっとできるレベルの者です)

よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 =A1&"-"&SUBSTITUTE(TRIM(MID(SUBSTITUTE(SUBSTITUTE(B1,",",REPT(" ",50)),"▼",REPT(" ",50)&"▼"),101,50))&","&TRIM(MID(SUBSTITUTE(SUBSTITUTE(B1,",",REPT(" ",50)),"▼",REPT(" ",50)&"▼"),51,50))&","&TRIM(MID(SUBSTITUTE(SUBSTITUTE(B1,",",REPT(" ",50)),"▼",REPT(" ",50)&"▼"),1,50)),",▼","▼")
 
(GobGob) 2014/08/25(月) 10:24

 なんか違うね。。。

 >ロ−ddd▼eee,ff → ロ−ff,eee▼ddd 

 「▼」が前後するルールがよーわかりまへん。
 
(GobGob) 2014/08/25(月) 11:03

 例題があまりにも雑なので、その例題のみに絞った場合

 =ReverseText(A1)

 Function ReverseText(txt As String) As String
    ReverseText = StrReverse(txt)
 End Function

 StrReverse -> 文字列の順序を逆にする関数。
(seiya) 2014/08/25(月) 11:18

 こんな感じ。。。?

 =KAO(B1)
 '------
Function KAO(MyTxt As String) As String
    Dim MyA As Variant
    Dim i As Long, r As String
        MyA = Application.Substitute(MyTxt, "▼", ",▼,")
        MyA = Split(MyA, ",")
        For i = UBound(MyA) To 0 Step -1
            KAO = KAO & "," & MyA(i)
        Next
        KAO = Application.Substitute(KAO, ",▼,", "▼")
        KAO = Right(KAO, Len(KAO) - 1)
End Function
 '------
(HANA) 2014/08/25(月) 11:46

早々にありがとうございます(衝突しました)、先にGobGob様への回答です。

 >「▼」が前後するルールがよーわかりまへん。

→ルールというか2種の区切り「▼」「,」の使い分け(※)はしていますが、入替えはあくまで“後のものから順番に前へ”で構わないです。
※「▼」は入力日が違う時、「,」は入力日が同じ時に使用しています
※今は入力日の古い順になっているのを、新しい順にしたいということです
※したがって、全データを入替えた以降は一番前から入力していくことになります
※基本的に文字列データは増え続けます(一定以上は削除予定)
※セルにデータがない(空白)のもあれば、“区切られた”文字列が20個超えるのもあります
※あと、「イ−」などA列との結合は不要です。(説明ベタすみません)

よろしかったでしょうか?

 >例題があまりにも雑..

→すみません..(苦笑)

seiya様、HANA様 しばらく確認時間いただきます..

(KAO) 2014/08/25(月) 11:53


ありがとうございます、マクロ知らないなりに試した結果です。(B列)

seiya様の結果

 >カタカナ,漢字,ひらがな	ながらひ,字漢,ナカタカ
 >140825▼abc▼DEF	FED▼cba▼528041
 >(空白)         (空白)	
 >Good▼感激,!!!	!!!,激感▼dooG

HANA様の結果

 >カタカナ,漢字,ひらがな	ひらがな,漢字,カタカナ
 >140825▼abc▼DEF	DEF▼abc▼140825
 >(空白)        	         #VALUE!
 >Good▼感激,!!!	!!!,感激▼Good

seiya様のは明らかに“雑な質問”によるもので申訳ないです(_ _;)

HANA様、求めていたものですっ! で、
・セル内が空欄(空白)の場合、結果も空欄にできますでしょうか?
・セル内の文字列の長さ(語数?)、全体行数等の制約はないのでしょうか?

あと少し..よろしくお願いします。

(KAO) 2014/08/25(月) 14:17


 こんな感じ

 =ReverseText(A1,",▼")

 Function ReverseText(txt As String, delim As String) As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "(.*)([" & delim & "])([^" & delim & "]+)$"
        Do While .test(txt)
            ReverseText = ReverseText & .Replace(txt, "$3$2")
            txt = .Replace(txt, "$1")
        Loop
        ReverseText = ReverseText & txt
    End With
End Function
(seiya) 2014/08/25(月) 15:03

seiya様

同様にそのままコピペして試しましたが、「#NAME?」となります。

先のとは使用方法が違ったりしますか?

(KAO) 2014/08/25(月) 15:39


 前出の

 Function ReverseText(txt As String) As String
    ReverseText = StrReverse(txt)
 End Function

 Function ReverseText(txt As String, delim As String) As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "(.*)([" & delim & "])([^" & delim & "]+)$"
        Do While .test(txt)
            ReverseText = ReverseText & .Replace(txt, "$3$2")
            txt = .Replace(txt, "$1")
        Loop
        ReverseText = ReverseText & txt
    End With
End Function

 に変更

 セルの数式を

 =ReverseText(A1)

 から

 =ReverseText(A1,",▼")
 ",▼"の部分は区切り文字

 に変更。

(seiya) 2014/08/25(月) 15:46


 >・セル内が空欄(空白)の場合、結果も空欄にできますでしょうか?
 IF関数と組み合わせて使ってもらえたらと思います。

 >・セル内の文字列の長さ(語数?)、全体行数等の制約はないのでしょうか?
 コード内で特に制限はかけていないので、後はエクセルの仕様によると思います。
   
(HANA) 2014/08/25(月) 16:33

seiya様、 うまくいきましたっ!
最初のを残したまま新規にコピペしたのが悪かったようです..
失礼しました(_ _;)

HANA様、 IFERRORで処理しようと思います..
(関数式と同じように使えるのですね)

今回のマクロでFUNCTIONなるものを初めて知りました。
最初は提示されたのを「=」からコピペしてエラーに戸惑いましたが、
(結構悩みました^^)やれやれです。

参考までにお二人の考え方の“サワリ?”のようなのを教えて
いただけると今後の研鑽のために嬉しいのですが..
(こういうのはいわゆる“企業秘密”みたいなもんで、ムリですかね?)

何れにしましても、ほぼあきらめていたことができるなんて感動ものです。

GobGob様の関数式、“もしやっ”と思いましたがどうでしょうか?
区切り文字の数に制限がないのがネックですかね..でも“力技”が
炸裂しそうな予感もしますが^^

みなさま、ありがとうございました!

(KAO) 2014/08/25(月) 17:43


 私のは単純で「ddd▼eee,ff 」を例にすると

        MyA = Application.Substitute(MyTxt, "▼", ",▼,")
 「▼」を「,▼,」に置換します・・・・・・・・・・・・・・→ddd,▼,eee,ff 

        MyA = Split(MyA, ",")
 「,」ごとに分けます ・・・・・・・・・・・・・・・・・・→ddd   ▼   eee   ff

        For i = UBound(MyA) To 0 Step -1
            KAO = KAO & "," & MyA(i)
        Next
 後ろから順に「,」をはさみながらくっつけて行きます
     ,ff → ,ff,ee → ,ff,ee,▼ ・・・・・・・・・・・・・・→ ,ff,ee,▼,ddd

        KAO = Application.Substitute(KAO, ",▼,", "▼")
 今度は「,▼,」を「▼」に置換します ・・・・・・・・・・→ ,ff,ee▼ddd

        KAO = Right(KAO, Len(KAO) - 1)
 最初の「,」が邪魔なので、RIGHT関数で切り取ります ・・・・・→ ff,ee▼ddd
  
(HANA) 2014/08/25(月) 17:55

 =ReverseText(A1,",▼")
 で区切り文字を指定した場合。

 Good▼感激,!!!

 最後の区切り文字から区切り文字以外の文字列を切り取る。---> ,!!!
 区切り文字とそれ以外の文字列の順序を逆にして一時的に関数の値にする。 -----> !!!,
 基の文字列がGood▼感激になる。

 ▼感激を切り取り上記の作業を繰り返す。 ----> !!!,感激▼

 これを区切り文字が有るだけ繰り返す。
 最終的に区切り文字のないGoodが残るので最後に付け加える。

 区切り文字が変更できるので、その辺は便利かも。

(seiya) 2014/08/25(月) 18:16


ほぉ〜..(感嘆!)..です^^
 >私のは単純で..(略)

→どうしてどうして..面白いです、発想が。
(いいアイデアは“単純にみえ”ますからね..)

 >区切り文字が変更できるので、その辺は便利かも

→同感です! 「一時的に関数の値にする」ところも気に入りました。

結果が同じでもお二人の“頭の中”が違うのがよくわかりました。
錆びついた脳ミソにいい刺激になります!

マクロにしろ関数にしろ“どうするか?”が出てこないと何もできませんからねぇ〜..
ここんところをこれからも学んでいきたいと思います。

それにしても素晴らしいですね、惜しげもなく考え方を披露いただいて..
本欄がこういう方々に支えられていることがよくわかりました。

これからもよろしくお願いします。

(KAO) 2014/08/26(火) 11:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.