
長い文字列の中身を特定の規則に則って入れ替えたい
ダメ元で質問させて頂きます。
1セル中の文字列を…例えば、長い文字列の中、4文字ずつの組で前2文字後ろ2文字をExcel関数を使って全て入れ替える方法はあるでしょうか?
文字数は、必ず8の倍数になり、使用する文字は0〜9とA〜Fのみです。
具体的には下記の様にしたいです。
0123456789ABCDEF……
↓
23016745AB89EFCD……
シートの構造上、無駄なセルを増やしたくないため、できれば1セルでスパッと済ませたいです。無理なら、作業セルが1〜2個あっても良いと考えております。
Excel2016でも使用できることを想定していますが、新しいバージョンなら可能という手があれば、そちらも教えて頂きたいです。
宜しくお願い致します。
No.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),))
とかではいかがでしょうか?
最近の回答を拝見しています。
実は質問せずにvbaで解決するつもりでいたのですが、No.4さんならもしかしたら…との期待でダメ元で質問させて頂きました。
No.2さんの方法が一番スッキリしそうだと思いますが、既存の関数でできるならその方が楽ですよね。
手元の365環境を使って簡単な文字列で試したところ、うまく動いてくれました!
TEXTJOINは2016でも使えるようなので、月曜日に会社で試してみようと思います。
取り敢えずはこの式の解読から始めます…。
有り難うございました。
No.3
- 回答日時:
> シートの構造上、無駄なセルを増やしたくないため、できれば1セルでスパッと済ませたいです。
無理なら、作業セルが1〜2個あっても良いと考えております。目的のシートというか対象のシートというのか、そのシート("Sheet3")とは別に作業用シート("Sheet3s")をつくってやれば、("Sheet3s")の目的の文字列のあるセルを、("Sheet3")の1つのセル参照させれば、「求める文字列」を表示させる1つのセルだけを使ったことになると思いますが、それでは具合が悪いのでしょうか。
、"Sheet3s"のA列に4文字づつを縦に並べ、B列にA列の4文字を(後2文字&前文字)としたものを出し、C列にB列の4文字をただ後ろに繋げた文字列を造ると、C列の最終行には、目的の文字列ができます。

回答有り難うございます。
力技でやろうとすると、かなりの領域を使用してしまうため、シートが重くなってしまうことを懸念しております。
個人的の趣味にもなってしまうのですが、綺麗に纏めたいというのもありまして…。
バイナリ形式のファイルをマクロで読み込んで、特定の条件を指定してシート1に16進で出力します。
最大で4000文字程度のデータが数千件…恐ろしく重くなるので通常は十数件程度になるように抽出範囲を絞りますが、それでもかなりの量になります。
シート2〜4には抽出したデータを分解、解釈するための関数や定義が詰まっており、無駄な領域を増やしたくないという事情もあります。
No.2
- 回答日時:
こんばんは、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)

文字数は最大4000文字程度になります。
ユーザー関数ですか。
聞いた事はありましたが、使った事はありませんでした。
マクロの関数と同じように書けるのですね。
ユーザー関数を使えば解決できそうです。
有り難うございます!
No.1
- 回答日時:
Excelだと、長い文字列の処理を関数のみでするのはマクロでないと
無理だと思う。
4文字ごとに作業セルに区切るなら関数での処理も可能ですが、8の
倍数といっても、どの程度の文字数なのかで処理するセル数の増減
があるため、作業セルが1~2個では済まないためです。
正規表現が使えるテキストエディタや、Wordなどを使って処理をする
なら簡単に処理できるものですから、別手段を検討されてはいかが。
※ 正規表現の例(Wordの場合は[ワイルドカード]使用のこと)
[検索する文字列]に
([0-9A-F]{2})([0-9A-F]{2})
[置換後の文字]に
\2\1
エディタってそんな置換も出来るのですか…。
今回、Excelの関数で出来ればラッキーだと思っております。
バイナリ形式のファイルから特定のデータを抽出して、見つかったデータを特定の列にその数分だけ上から順に16進でセットするシートがありまして…。
新しい形式のデータを解析するのに、質問文の並びにできれば既存の仕組みをそのまま使えるもので。
最近は知らない高度な関数も結構あるようなので、関数でサクッと出来れば…と考えた次第です…。
無理そうならマクロでなんとかしようと思います。
エディタの件、秀丸なら出来そうですよね。
今後のためにもかなり役に立ちそうなので、勉強させていただこうと思います。
有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
このカテゴリの人気Q&Aランキング
-
4
(Excel)あるセルに文字を入力...
-
5
あるセルに特定の文字列を打つ...
-
6
エクセルで、変な矢印がでて、...
-
7
エクセルのセル内の余白の設定...
-
8
エクセル: セルの枠を超えて表示
-
9
EXCELで式からグラフを描くには?
-
10
エクセルで作った新しいウイン...
-
11
Excelで隣のセルと同じ内容に列...
-
12
エクセル:シート名を手入力で...
-
13
エクセルである行以下全部を削...
-
14
グラフの横・縦項目が全部表示...
-
15
Excelで数式だけを消して、数値...
-
16
印刷用紙の中央に点線をいれた...
-
17
EXCELで2つの数値のうち大きい...
-
18
エクセル 同じ値を探して隣の...
-
19
複数のセルの入力内容を一度に...
-
20
エクセル 特定の文字を入れる...
おすすめ情報
公式facebook
公式twitter
皆様有難うございました。
思いのほか回答を頂き、Excelの中でも自分が一部の機能しか使用していないのだなと改めて気付かされました。
また、エディタについてのテクニックについて知ることができ、思わぬ収穫になりました。
誠に恐縮ではありますが、当初の希望である関数での解決策を示して下さったNo.4さんをベストアンサーに選ばせて頂きます。