エクセルで下記のようなことを行いたいです。アドバイスお願い致します。
●処理前
A1⇒ 2151 B1⇒ RSS1234 C1⇒ RSS1234+RSX1234
A2⇒ 3412 B2⇒ RSS5678 C2⇒ RSS5678+RSX5678
A3⇒ 5486 B3⇒ RSS3456 C3⇒ RSS3456+RSX3456
・
・
・
●処理後要望
A1⇒ 2151 B1⇒ RSS2151 C1⇒ RSS2151+RSX2151
A2⇒ 3412 B2⇒ RSS3412 C2⇒ RSS3412+RSX3412
A3⇒ 5486 B3⇒ RSS5486 C3⇒ RSS5486+RSX5486
・
・
・
A列が空白になるまで上記置換が行われる。
となるようなVBAを作りたいのです。
アドバイスお願い致します。
No.4ベストアンサー
- 回答日時:
置換をしたい範囲を選択しているシート上にあるC列~D列としますと、次の様なVBAマクロは如何でしょうか?
Sub Macro()
Dim SN As String
Dim LR As Long
SN = ActiveSheet.Name
ActiveSheet.Select
If Application.WorksheetFunction.Count(Columns("A:A")) = 0 Then Exit Sub
LR = Application.WorksheetFunction.Match(9E+307, Columns("A:A"))
Range("B1:D" & LR).Replace What:="=", Replacement:=" ="
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(SN).Select
Sheets(Sheets.Count).Range("C1:D" & LR).FormulaR1C1 = _
"=SUBSTITUTE('" & SN & "'!RC,MID('" & SN & "'!RC2,MIN(" & _
"IF(ISNUMBER(FIND(0,'" & SN & "'!RC2)),FIND(0,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(1,'" & SN & "'!RC2)),FIND(1,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(2,'" & SN & "'!RC2)),FIND(2,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(3,'" & SN & "'!RC2)),FIND(3,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(4,'" & SN & "'!RC2)),FIND(4,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(5,'" & SN & "'!RC2)),FIND(5,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(6,'" & SN & "'!RC2)),FIND(6,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(7,'" & SN & "'!RC2)),FIND(7,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(8,'" & SN & "'!RC2)),FIND(8,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)," & _
"IF(ISNUMBER(FIND(9,'" & SN & "'!RC2)),FIND(9,'" & SN & "'!RC2),LEN('" & SN & "'!RC2)+1)" & _
"),4),'" & SN & "'!RC1)"
Sheets(SN).Range("C1:D" & LR).Value = Sheets(Sheets.Count).Range("C1:D" & LR).Value
Application.DisplayAlerts = False
Sheets(Sheets.Count).Delete
Application.DisplayAlerts = True
Range("B1:D" & LR).Replace What:=" =", Replacement:="="
End Sub
尚、上記のマクロは、あくまで
>⇒B列には、必ず数値が含まれております。
>置換をしたい範囲のセル(D列までとすれば、B~D列)には、VBが走る前の初期状態ではいずれも必ず同じ4桁の数値が含まれている状態に致します。
という条件が満たされている場合においてのみ有効なマクロです。
もしB列に入力されている文字列が、例えば
R2S1234
等の様に4桁ではない数字(この場合は「2」)が、4桁の数字よりも前の部分に含まれているものであった場合には、正しい結果を得られませんので注意して下さい。
No.5
- 回答日時:
>B列~〇列のセル内に含まれる特定の4桁の数値を
最初のご相談の情報提供と違う事が書かれていますが、今度は「特定の」例えば9999がB列以右の「全ての行の全てのセルに共通で」記載があるということで、今度こそ間違いないんですね。
いずれにしても回答済みのマクロからほとんど何も変える必要がありません。
sub macro1()
dim c as string, cx as string
dim i as integer
dim r as long
for i = 1 to len(range("B1"))
if mid(range("B1"), i, 1) like "[0-9]" then
cx = cx & mid(range("B1"), i, 1)
end if
next i
for r = 1 to range("A65536").end(xlup).row
cells(r, "B").resize(1, 255).replace _
what:=cx, replacement:=cells(r, "A"), lookat:=xlpart
next r
end sub
>どのような条件を明確にすれば良いかさえ分からない
「あなたのエクセルの、いま目に見えてる事実」と「それがどうなって欲しいのかの姿」を目に見えるままありのまま正しく丁寧に情報提供すればいいんです。
No.3
- 回答日時:
>説明不足大変失礼致しました。
逆に分かりにくくなるのではと思っておりましたが、お言葉に甘えて……補足を読んでもまだ、条件が足りていません。したがって誰かが勝手に仮定なりをしなければ、答えを出すことはムリです。「不可能」なのですから、分かりやすさ以前の問題です。
>……人間が一行ずつやるなら(D列までとするなら)Bnセル~Dnセルを範囲選択して、特定数値である9999を……
まさにそういう、人間が手作業で行うなら、どういうルールでの処理になるのか?ということです。基本原則が不明だということです。
●補足のデータ例では、B 列~ D 列の 9 セルに全て「9999」と書いてありますね。ところが質問文における同じ範囲には、「1234」、「5678」、「3456」と 3 種類も出てきますよ。
●補足を見る限り、各文字列中の何文字目に置換対象の文字列が出てくるのかも一定していないようです。
人間は、「何となく」といった感覚で、本当は複雑な条件が組み合わさった作業でも、簡単にこなしてしまったりします。しかし、同じことを機械に理解させるには、数学の問題を解くのと同じで、具体的かつ過不足のない条件を与える必要があります。問題が複雑になれば、それだけ数学力なり論理力が求められるようになります。
例えば「回文を作成せよ」という問題があれば、(1)文末の句点がある場合のみそれを除去、(2)文字列中の全ての文字の位置を昇順で付番、(3)番号の降順で文字を並べ替え、(4)(1)で句点を除去していた場合のみそれを付加、といったふうに、「紛れ」のないルールを明示します。そうでなければ、永遠に答えには到達できません。
条件さえはっきりして、その条件の数がそれほど多くはないとすれば、置換するコードを書くこと自体は簡単です。
この回答への補足
ご気分を害されるような書き込みになってしまったことを心より謝ります。
申し訳ございません。
どのような条件を明確にすれば良いかさえ分からない私は本来質問するのは失礼に当たるのかも知れません。
ただどうしても困っており助けて頂きたいという思いで投稿致しました。
何卒ご容赦のほどお願い致します。
No.2
- 回答日時:
どの様な処理を行えば良いのかという条件に、不明な点がありますので、追加情報を御教え願います。
●A列に自然数以外の値(文字列、負の数、小数点以下の桁を含んでいる数値)が入力されていた場合には、どの様にすれば良いのでしょうか?
●B列のセルに数値が含まれていない場合には、どの様にすれば良いのでしょうか?
●B列のセルに
=A20+ABC1234+DEF5678+GHI987654
等の様に、複数種類の数値が入力されていた場合には、どの数値を置換対象の数値とすれば良いのでしょうか?
以上の点に関して御教え願います。
この回答への補足
ご丁寧にありがとうございます。助かります。
ご確認について、今回の仕様の要望について返答させて頂きます。
●A列に自然数以外の値(文字列、負の数、小数点以下の桁を含んでいる数値)が入力されていた場合には、どの様にすれば良いのでしょうか?
⇒今回は最後ブランクになるまで必ず自然数4桁のみが入ります。よって入力に自然数以外の値は考慮する必要はございません。
●B列のセルに数値が含まれていない場合には、どの様にすれば良いのでしょうか?
⇒B列には、必ず数値が含まれております。
置換をしたい範囲のセル(D列までとすれば、B~D列)には、VBが走る前の初期状態ではいずれも必ず同じ4桁の数値が含まれている状態に致します。(例.9999)
●B列のセルに
=A20+ABC1234+DEF5678+GHI987654
等の様に、複数種類の数値が入力されていた場合には、どの数値を置換対象の数値とすれば良いのでしょうか?
⇒VBを走らせる前の初期状態として、必ず同じ4桁の数値が入っている状態にしております。
4桁の数値を9999とすれば、ご質問の例では
=A9999+ABC9999+DEF9999+GHI9999
のように数値部分は必ず9999になります。
ご丁寧にありがとうございます。
ご検討宜しくお願い致します<m(__)m>
No.1
- 回答日時:
>エクセルでセル内の特定数値を他セルの数値で置換
というご相談ですが、現実にやりたいのは「B列やC列にある不特定の数字」をA列の特定の数字に置き換えたい、となっています。
たとえばB1を見て「1234」という数字がここでは対象になると「特定して」、B1,C1の1234を2151に置き換えたいとか。そういった「あなたが何をしたいのか(ルール)の説明」が足りてません、という事です。
で。
説明を待っていても始まらないので、勝手にそーいうルールだとします。
作成例:
sub macro1()
dim r as long
for r = 1 to range("A65536").end(xlup).row
cells(r, "B").resize(1, 2).replace _
what:=right(cells(r, "B"), len(cells(r, "A"))), _
replacement:=cells(r, "A"), _
lookat:=xlpart
next r
end sub
#参考
ご質問に書かれてる(「説明のための(事実と違う?)」)サンプルからでは、実はこーでもいいと読み取れます。
sub macro2()
dim r as long
for r = 1 to range("A65536").end(xlup).row
cells(r, "B") = "RSS" & cells(r, "A")
cells(r, "C") = cells(r, "B") & "+RSX" & cells(r, "A")
next r
end sub
実際にヤリタイ事に応じて、適切に応用してください。
この回答への補足
驚速でのご返答アドバイスありがとうございます。
説明不足大変失礼致しました。
逆に分かりにくくなるのではと思っておりましたが、お言葉に甘えて実際にやりたいことを書きますと、
・A列セルに4桁の数値が入っている。
・B列~〇列のセルに色々な式や文字列が入っている。
・B列~〇列のセルの中には特定の4桁の数値が入っている。
・上記条件で、同じ行の単位でB列~〇列のセル内に含まれる特定の4桁の数値をA列の数値に置き換えたい。
です。
改めて例を希望に近い形で書きますと、
●変換前
A列 B列 C列 D列 ・・・・
1行 1111 =RSS9999 xy9999 b9999
2行 2222 bdr9999x c9999t =RSS9999
3行 3333 bne9999y 9999yr kys9999+ki9999
・
・
●変換後
A列 B列 C列 D列 ・・・・
1行 1111 =RSS1111 xy1111 b1111
2行 2222 bdr2222x c2222t =RSS2222
3行 3333 bne3333y 3333yr kys3333+ki3333
・
・
Aセルが空白になるまで。
となり、人間が一行ずつやるなら(D列までとするなら)
Bnセル~Dnセルを範囲選択して、特定数値である9999をAnセル数値で置換機能で置換を繰り返す非常に簡単な置換作業になります。
しかし、変換したい対象が数百行×数十列なのでプログラムでやらないと厳しいと思ったのですが、知識不足で頓挫しました。
大変お手数をおかけいたしますが、アドバイス頂けると助かります。
もし可能であれば、行は空白になるまで、列はD列までという前提で教えて頂けるとより助かります。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- 教えて!goo RSSについて 1 2022/08/17 15:15
- メディア・マスコミ 労働者は代々木に集結してますか? 1 2022/05/01 11:51
- メディア・マスコミ 西側メディア、読みづらい誤字。 1 2022/12/25 20:39
- 英語 何と言っているのですか? 9 2023/04/08 17:26
- その他(ブログ) まとめサイトを成長させる方法について 1 2022/12/30 18:14
- gooブログ gooブログについて 1 2022/05/09 09:46
- Excel(エクセル) エクセルの関数式を教えてください。 2 2022/11/29 21:09
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
背景色の有無を判断をして別の...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
エクセルで最初のスペースまで...
-
PowerPointで表の1つの列だけ...
-
エクセルで、2種類のデータを...
-
エクセルでオートフィルタのボ...
-
VBAで文字列を数値に変換したい
-
エクセル 文字数 多い順 並...
-
SUMIFとCOUNTIFを合わせたよう...
-
2つのエクセルのデータを同じよ...
-
エクセルで時刻(8:00~20:00)...
-
文字列に数字を含むセルを調べたい
-
エクセルのオートフィルタで最...
-
エクセル(勝手に太字になる)
-
Excelのオートフィルタで非表示...
-
エクセルで文字が混じった数字...
-
ピボットテーブル 0個の行を...
-
エクセルでの複数条件下での標...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
背景色の有無を判断をして別の...
-
Excelで全シートから検索し列で...
-
任意のセルに小計、合計と入力...
-
VBA 動作の後、動作した行のA...
-
結合のループ処理のマクロ
-
エクセルでセル内の特定数値を...
-
エクセルで「セルを結合して中...
-
エクセルのユーザー定義で
-
EXCELで2つの数値のうち大きい...
-
Excelで隣のセルと同じ内容に列...
-
エクセルで二つの数字の小さい...
-
PowerPointで表の1つの列だけ...
-
エクセルで時刻(8:00~20:00)...
-
エクセルでオートフィルタのボ...
-
エクセルで、2種類のデータを...
-
2つのエクセルのデータを同じよ...
-
エクセルで最初のスペースまで...
-
エクセルのオートフィルタで最...
-
SUMIFとCOUNTIFを合わせたよう...
-
エクセルVBA、別ブックへ転記す...
おすすめ情報