[[20180703122641]] 『置換をマクロで処理したいです』(nya) ページの最後に飛ぶ

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

 

『置換をマクロで処理したいです』(nya)

マクロ初心者ですが宜しくお願い致します。

エクセルのシートの
A列に置換前の数字や文字列、
B列に置換後の数字や文字列

を用意して一番上から最後まで順番に
処理を行って、C列に成功したか失敗したかを
残していくマクロはどのようにすれば宜しいでしょうか?

置換をしたいのは別のエクセルファイルを選択する仕様をイメージしております。

また、画像ファイルのファイル名も上記の用な流れでファイル名を置換することは可能でしょうか?

恐れ入りますが、ご回答宜しくお願い致します。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


置換前の文字列と置換後の文字列しかありませんが、元の文字列はどこにあるのでしょう? ダイアログでファイルを選択するのでしょうか? もしかして、変えるのは文字列ではなく、ファイル名?

何をしたいのかが伝わらないので、うまくいかないまでも、ご自分で書いたコードがあれば、それを貼ってください。
(???) 2018/07/03(火) 12:52


イメージですが、置換用とエクセルファイルと置換したいエクセルファイルは別で考えております。
変えるのはエクセルと画像のファイル名二つしたいです。

エクセルも画像ファイルも置換前と置換後の文字列または数字は
シート1のA列とB列に用意しておくという意味です。

TESTというエクセルファイルのシート1の
A列に一行目から置換前の文字や数値を貼り付けて、
B列の一行目からは置換後の文字や数値を貼り付けて
C列に成功と失敗の結果を残すとどれが置換されたか確認できますので可能であれば
お願い致します。

置換前と置換後を用意したエクセルファイルからまずどのファイルを置換していくか
ファイル選択でフォルダを開かせて、ファイル選択⇒置換しますか?はい、いいえ⇒

はいで置換スタートみたいなイメージです。
(nya) 2018/07/03(火) 15:25


失敗ってどういうのが失敗なのですか?
置き換える文字が無いのが失敗なのですか?
失敗だと何が不都合なのですか?

あと、CountIF関数とかで事前に数えるのはなしですか?
置換機能で置き換えるものがなくてもエラーとか返さないし、
置き換えるものがなければ、置き換えなかったのと同じだし、
失敗というイメージが掴みにくいかなと。

(まっつわん) 2018/07/03(火) 15:52


まっつわんさん

ご返答ありがとうございます。

失敗に関しましては置き換える文字が見つからなかったという意味です。
何千個と置換する文字がある場合、どれが見つからなかったのかあとで調べれたらと思い
記載しました。

置換したいリストに漏れがある可能性があるためです。

ややこしい場合はこちらは後回しでとりあえず
置換ができれば大丈夫です。

宜しくお願い致します。
(nya) 2018/07/03(火) 17:12


 >C列に成功したか失敗したかを 
 >残していくマクロはどのようにすれば宜しいでしょうか? 

1)C列にCountIf関数で数えて0より大きなら成功、それ以外なら失敗という数式を入れる。
2)C列の個々のセルを順に見て行って、もし、成功なら、置換を実行する。

とすればよいと思います。

ファイル名の場合は全く違った話になるので、
別途考えた方が良いと思います。
とはいえ画像ファイルに限定した話なら、
自作するより、フリーのソフトを使ってはいかがでしょうか?

http://www.ryouto.jp/f6exif/
ファイルのリネーム機能のほかにも便利そうな機能があります。

(まっつわん) 2018/07/04(水) 09:20


私には未だ、何を文字列置換したいのかが判らないのですが…。 コードを見れば判断できるかも、と考えましたが、一向に書いてもらえませんし。

置換したいのは、ブックの中の全シートの全文字列が対象なのですか? それとも、フォルダ指定した中にある各ファイル名なのですか? それが判らないと、文字列置換にはReplace命令を使ってください、としか書きようがないです。
(???) 2018/07/04(水) 10:21


まっつわんさん

画像ファイルの置換は当方でもフリーソフトで見つけましてできました!

エクセルファイルについてですが、
置換のマクロは記録をしてコードを作って編集すると、

Cells.Replace What:="置換前1", Replacement:="置換後1", LookAt:=xlPart, SearchOrder _

        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        Cells.Replace What:="置換前2 ", Replacement:="置換後2", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

        Cells.Replace What:="置換前3 ", Replacement:="置換後3", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

このようにコードをコピペすれば作れますが置換の文字が多い場合が大変ですので、
置換のマクロの対象をエクセルのa列とb列に用意してはどうかと思いご相談させて頂きました。


置換前 置換後 処理結果
1 a
2 AB
3 B
4 C
5 J 見つかりませんでした
6 N
7 S
8 SA 見つかりませんでした
9 A
10 AB
11 B
12 C
13 J
14 N
15 S 見つかりませんでした
16 SA
17 A
18 AB
19 B
20 C

こちらを上から順にエクセルの表を使ってマクロで置換をするという流れです。

置換したいファイルはファイル選択をするという流れをイメージしております。

いかがでしょうか?
(nya) 2018/07/04(水) 18:17


ごめん。表が崩れててイメージがつかめません。

ここが、
左側に(行の先頭に)空白があると崩れない仕様なようなので、
敢えて表の左側に空白列を一つ挿入し、
その空白列も含めてコピペしてみてください。
あと、送信前にプレビューも確認してみてください。

つまり、シート上にどのように値が羅列してあるかで、
その値のあるセルをどのように取得していくのかの考え方が変わるので、
想像力を働かせて無駄に考えたり、無駄に作業をしたくないということです。

	◆ 		
	置換前	置換後	処理結果 
	1	a	
	2	AB	
	3	B	
	4	C	
	5	J	見つかりませんでした 
	6	N	
	7	S	
	8	SA	見つかりませんでした 
	9	A	
	10	AB	
	11	B	
	12	C	
	13	J	
	14	N	
	15	S	見つかりませんでした 
	16	SA	
	17	A	
	18	AB	
	19	B	
	20	C	

そのままこちらにコピペするとこうなるのですが、
番号を文字に置き換えるわけではないですよね?

(まっつわん) 2018/07/05(木) 08:37


上記の置換リストは例ですので、実際は文字や数値となります。

置換前の文字や数値を
A列に、置換後をB列に貼り付けるというシンプルな表なのですが。

置換する文字や数値をマクロの中に書き込むのではなくセルA(1,1)から一番下まで順に
置換していくいうプログラムをイメージしております
(nya) 2018/07/05(木) 15:59


こちらどなたかご回答願えますでしょうか?
(nya) 2018/08/08(水) 10:37

いまいち何をどう置換するのかわからないのですが、置換したいエクセルファイルがあって、
変換前の名前をA1から記載、変換後の名前をA2に記載していると言う事でしょうか。
ブラッシュアップは必要ですが、簡易的にこんな感じであっていますか。
このマクロのファイルを変換したいファイルと同フォルダに入れてください。

Sub sample()

Dim Name_Before As Variant
Dim Name_After As Variant
Dim Row As Integer
Dim Path As String
Dim File As String

File = ThisWorkbook.Name
Path = ThisWorkbook.Path
Row = 1

Name_Before = Dir(Path & "\*")

Do While Name_Before <> ""
If Name_Before <> "." And Name_Before <> ".." And Name_Before <> File Then

Name_After = Cells(Row, 2)

Debug.Print Name_Before
Debug.Print Name_After

Name Path & "\" & Name_Before As Path & "\" & Name_After
Row = Row + 1

End If

Name_Before = Dir
Loop

End Sub

※A列に記載する名前は、実際に変換するファイルの名前の

順番と一致していないといけないです
(ゆ) 2018/08/08(水) 12:16


 Sub main()
    Dim fn As String, afn As String, c As Range, wb As Workbook, sht As Worksheet
    MsgBox "置換前のエクセルファイルを選択してください"
    fn = Application.GetOpenFilename(FileFilter:="Excel ファイル (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm", FilterIndex:=1, Title:="置換前のエクセルファイルを選択", MultiSelect:=False)
    If fn <> "False" Then
        afn = Left(fn, InStrRev(fn, "\")) & "置換後" & Mid(fn, InStrRev(fn, "\") + 1)
        FileCopy fn, afn
    Else
        Exit Sub
    End If
    Set wb = Workbooks.Open(afn)
        For Each c In ThisWorkbook.Sheets("Sheet1").Range("A:A").SpecialCells(2)
            c.Offset(, 2).Value = "見つかりませんでした"
            For Each sht In wb.Worksheets
            If Not sht.Cells.Find(c.Value, , , LookAt:=xlPart) Is Nothing Then c.Offset(, 2).Value = ""
            sht.Cells.Replace What:=c.Value, Replacement:=c.Offset(, 1).Value, LookAt:=xlPart
            Next sht
        Next c
    Application.DisplayAlerts = False
    wb.Close True
End Sub
(mm) 2018/08/08(水) 14:12

 こんな感じで

 Sub test()
     Dim fn As String, rng As Range, r As Range, c As Range
     fn = Application.GetOpenFilename("ExcelBooks,*.xls*")
     If fn = "False" Then Exit Sub
     Application.ScreenUpdating = False
     Set rng = ThisWorkbook.Sheets("sheet1").Cells(1).CurrentRegion.Offset(1)
     rng.Columns(3).ClearContents
     With Workbooks.Open(fn).Sheets(1)
         For Each r In rng.Columns(1).Cells
             If r.Value <> "" Then
                 Set c = .Cells.Find(r.Value, , , 2)
                 If c Is Nothing Then
                     r(, 3) = "見つかりませんでした"
                 Else
                     .Cells.Replace r.Value, r(, 2).Value, 2
                 End If
             End If
         Next
         .Parent.Close True
     End With
     Application.ScreenUpdating = True
 End Sub
(seiya) 2018/08/08(水) 15:37

コメント返信:

[ 一覧(最新更新順) ]


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