教えて!gooにおける不適切な投稿への対応について

長い文字列の中身を特定の規則に則って入れ替えたい                          

ダメ元で質問させて頂きます。

1セル中の文字列を…例えば、長い文字列の中、4文字ずつの組で前2文字後ろ2文字をExcel関数を使って全て入れ替える方法はあるでしょうか?
文字数は、必ず8の倍数になり、使用する文字は0〜9とA〜Fのみです。

具体的には下記の様にしたいです。
0123456789ABCDEF……

23016745AB89EFCD……

シートの構造上、無駄なセルを増やしたくないため、できれば1セルでスパッと済ませたいです。無理なら、作業セルが1〜2個あっても良いと考えております。

Excel2016でも使用できることを想定していますが、新しいバージョンなら可能という手があれば、そちらも教えて頂きたいです。

宜しくお願い致します。

質問者からの補足コメント

  • 皆様有難うございました。

    思いのほか回答を頂き、Excelの中でも自分が一部の機能しか使用していないのだなと改めて気付かされました。
    また、エディタについてのテクニックについて知ることができ、思わぬ収穫になりました。

    誠に恐縮ではありますが、当初の希望である関数での解決策を示して下さったNo.4さんをベストアンサーに選ばせて頂きます。

      補足日時:2021/04/09 23:24
gooドクター

A 回答 (4件)

こんばんは



No2様のユーザー定義関数による方法がよいと思いますが、無理矢理に関数で行う方法を考えてみました。

元の文字列は4の倍数であると決め打ちですが、A1セルに元の文字列があるとして、TEXTJOIN関数が使える環境であることが条件です。

例えばA2セルに
=TEXTJOIN("",1,INDEX(MID(A1,ROW(OFFSET(A1,,,INT(LEN(A1)/4)))*4-1,2) & MID($A$1,ROW(OFFSET(A1,,,INT(LEN(A1)/4)))*4-3,2),))
とかではいかがでしょうか?
    • good
    • 3
この回答へのお礼

最近の回答を拝見しています。
実は質問せずにvbaで解決するつもりでいたのですが、No.4さんならもしかしたら…との期待でダメ元で質問させて頂きました。

No.2さんの方法が一番スッキリしそうだと思いますが、既存の関数でできるならその方が楽ですよね。

手元の365環境を使って簡単な文字列で試したところ、うまく動いてくれました!
TEXTJOINは2016でも使えるようなので、月曜日に会社で試してみようと思います。

取り敢えずはこの式の解読から始めます…。

有り難うございました。

お礼日時:2021/04/09 22:18

> シートの構造上、無駄なセルを増やしたくないため、できれば1セルでスパッと済ませたいです。

無理なら、作業セルが1〜2個あっても良いと考えております。

目的のシートというか対象のシートというのか、そのシート("Sheet3")とは別に作業用シート("Sheet3s")をつくってやれば、("Sheet3s")の目的の文字列のあるセルを、("Sheet3")の1つのセル参照させれば、「求める文字列」を表示させる1つのセルだけを使ったことになると思いますが、それでは具合が悪いのでしょうか。


、"Sheet3s"のA列に4文字づつを縦に並べ、B列にA列の4文字を(後2文字&前文字)としたものを出し、C列にB列の4文字をただ後ろに繋げた文字列を造ると、C列の最終行には、目的の文字列ができます。
「長い文字列の中身を特定の規則に則って入れ」の回答画像3
    • good
    • 0
この回答へのお礼

回答有り難うございます。

力技でやろうとすると、かなりの領域を使用してしまうため、シートが重くなってしまうことを懸念しております。
個人的の趣味にもなってしまうのですが、綺麗に纏めたいというのもありまして…。

バイナリ形式のファイルをマクロで読み込んで、特定の条件を指定してシート1に16進で出力します。
最大で4000文字程度のデータが数千件…恐ろしく重くなるので通常は十数件程度になるように抽出範囲を絞りますが、それでもかなりの量になります。
シート2〜4には抽出したデータを分解、解釈するための関数や定義が詰まっており、無駄な領域を増やしたくないという事情もあります。

お礼日時:2021/04/09 21:47

こんばんは、800文字とかあるのでしょうか?


関数よくわからないのですが、16文字程度ならべたで、、
=CONCATENATE(MID(A1, 3, 2),MID(A1, 1, 2),MID(A1, 7, 2),MID(A1, 5, 2),MID(A1, 11, 2),MID(A1, 9, 2),MID(A1, 15, 2),MID(A1, 13, 2))

800とかあるなら、、関数で出来るのかな?
私には無理なので、好みはありますが、ユーザー関数を作った方が早いかと

Public Function ch_swap3412(strVal As String)
Dim i As Long, buf As String
For i = 1 To Len(strVal) Step 4
If buf = "" Then
buf = Mid(strVal, i + 2, 2) & Mid(strVal, i, 2)
Else
buf = buf & Mid(strVal, i + 2, 2) & Mid(strVal, i, 2)
End If
Next
ch_swap3412 = buf
End Function

セルに =ch_swap3412(A1)
「長い文字列の中身を特定の規則に則って入れ」の回答画像2
    • good
    • 1
この回答へのお礼

文字数は最大4000文字程度になります。

ユーザー関数ですか。
聞いた事はありましたが、使った事はありませんでした。
マクロの関数と同じように書けるのですね。

ユーザー関数を使えば解決できそうです。
有り難うございます!

お礼日時:2021/04/09 21:11

Excelだと、長い文字列の処理を関数のみでするのはマクロでないと


無理だと思う。
4文字ごとに作業セルに区切るなら関数での処理も可能ですが、8の
倍数といっても、どの程度の文字数なのかで処理するセル数の増減
があるため、作業セルが1~2個では済まないためです。

正規表現が使えるテキストエディタや、Wordなどを使って処理をする
なら簡単に処理できるものですから、別手段を検討されてはいかが。

※ 正規表現の例(Wordの場合は[ワイルドカード]使用のこと)
[検索する文字列]に
 ([0-9A-F]{2})([0-9A-F]{2})
[置換後の文字]に
 \2\1
    • good
    • 1
この回答へのお礼

エディタってそんな置換も出来るのですか…。

今回、Excelの関数で出来ればラッキーだと思っております。

バイナリ形式のファイルから特定のデータを抽出して、見つかったデータを特定の列にその数分だけ上から順に16進でセットするシートがありまして…。
新しい形式のデータを解析するのに、質問文の並びにできれば既存の仕組みをそのまま使えるもので。

最近は知らない高度な関数も結構あるようなので、関数でサクッと出来れば…と考えた次第です…。
無理そうならマクロでなんとかしようと思います。


エディタの件、秀丸なら出来そうですよね。
今後のためにもかなり役に立ちそうなので、勉強させていただこうと思います。

有り難うございました。

お礼日時:2021/04/09 20:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング