[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA 条件による置換』(花梨)
お世話になります。初心者です。よろしくお願い致します。
範囲C29:AG29,C31:AG31,C33:AG33,C35:AG35,C37:AG37,C39:AG39,C41:AG41,C43:AG43,C45:AG45,C47:AG47,C49:AG49,C51:AG51に入力されている特定の値を4桁の数字に置換する為、以下の内容を入力しました。
――――――――――――――――――――
Dim myDic As Object
'コードへ置換 Set myDic = CreateObject("Scripting.Dictionary") myDic.Add "会議", "9000" myDic.Add "研修", "8000" myDic.Add "発*", "0003" myDic.Add "×", "0002" myDic.Add "", "0001" '置換範囲 Dim bool As Boolean, myRange As Range Set myRange = Range("C29:AG29,C31:AG31,C33:AG33,C35:AG35,C37:AG37,C39:AG39,C41:AG41,C43:AG43,C45:AG45,C47:AG47,C49:AG49,C51:AG51") For Each Var In myDic bool = myRange.Replace(Var, myDic(Var), LookAt:=xlPart) Next Var ――――――――――――――――――――
この内容で置換自体は行えるのですが、それぞれ
『C1:AG1の範囲に値が入っていない場合、その該当する列の置換を行わない』
としたいのですが、うまくいきません。
例えば、C1に値がなかった場合、
C29,C31,C33,C35,C37,C39,C41,C43,C45,C47,C49,C51は置換しない
といった内容にしたいと考えております。
解決方法をご教授頂ければ幸いです。
よろしくお願い致します。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
現在のコードを理解できていますか?
(マナ) 2019/03/16(土) 12:00
できれば、試してみたことを提示してください。
(マナ) 2019/03/16(土) 12:02
解決策のご教授をお願い致します。
(花梨) 2019/03/16(土) 12:25
では、↓ここでは何をしているかわかりますか。
> bool = myRange.Replace(Var, myDic(Var), LookAt:=xlPart)
(マナ) 2019/03/16(土) 12:55
そういうことであれば、申し訳ございませんが、
わたしには、解決に導くことができそうにありません。
他の方からの回答をお待ち下さい。
(マナ) 2019/03/16(土) 13:55
弄ってみました。ただし、 追記した部分以外の事は全く考えてないので、目的通りの結果を保証するものではありません。 その点は重々ご承知おき下さい。あしからず^^;
Sub test() Dim myDic As Object, Var As Variant
'コードへ置換 Set myDic = CreateObject("Scripting.Dictionary") myDic.Add "会議", "9000" myDic.Add "研修", "8000" myDic.Add "発*", "0003" myDic.Add "×", "0002" myDic.Add "", "0001"
'置換範囲 Dim bool As Boolean, myRange As Range Rem ▼削除---------------------------------------------------------------------------------------------------------------------------------- ' Set myRange = Range("C29:AG29,C31:AG31,C33:AG33,C35:AG35,C37:AG37,C39:AG39,C41:AG41,C43:AG43,C45:AG45,C47:AG47,C49:AG49,C51:AG51") Rem ▲ここまで------------------------------------------------------------------------------------------------------------------------------
Rem ▼追記---------------------------------------------------------------------------------------------------------------------------------- Dim c As Range, TargetCol As Range For Each c In Range("C1:AG1").Columns If Not IsEmpty(c) Then If TargetCol Is Nothing Then Set TargetCol = c Else Set TargetCol = Union(TargetCol, c) End If Next If TargetCol Is Nothing Then MsgBox "1行目にひとつも値がなかった" Exit Sub End If Set myRange = Intersect(Range("29:29,31:31,33:33,35:35,37:37,39:39,41:41,43:43,45:45,47:47,49:49,51:51"), TargetCol.EntireColumn) Rem ▲ここまで------------------------------------------------------------------------------------------------------------------------------
For Each Var In myDic bool = myRange.Replace(Var, myDic(Var), LookAt:=xlPart) Next Var End Sub
(白茶) 2019/03/16(土) 14:39
・・・大変申し訳ございません…。
ご相談内容の修正がございます…。
<before>
『C1:AG1の範囲に値が入っていない場合、その該当する列の置換を行わない』
<after>
『C1:AG1の範囲のうち、値が入っていないまたはIF関数の結果により非表示の場合、その該当する列の置換を行わない』
ご教授いただいた内容を実行した結果、動くファイルと、そうでないファイルがあった為、
おかしいなと思い、1行目のセルをチェックしてみたところ、判明しました・・・。
今回、仕事で37の支店から提出されたデータの置換処理をスムーズに行いたいと思い、ご相談に至りました。
数種のファイルをチェックしてから投稿したのですが、お教え頂いた内容でサクサク出来ると
喜んでいたのも束の間、IF関数で非表示にしているファイルが次々と出てきました・・・・・。
聞くに堪えない言い訳で申し訳ございません・・・。
もし、afterの方でも対応可能な内容でしたら、ご教授をお願い致します・・・。
本当に申し訳ございません・・・
(花梨) 2019/03/16(土) 15:30
>IF関数で非表示にしている というのが長さゼロの文字列を返しているって意味だとすれば
If Not IsEmpty(c) Then の部分を
If Len(c) > 0 Then に代えればイケそうですね。
他の方法(例えば半角スペース、書式設定による特定の値の非表示等)であれば、 ちょっとまた話が変わってきそうな。。。
(白茶) 2019/03/16(土) 16:00
休み返上して出勤していたのですが、帰れそうです・・・(泣)
白茶様!神様です!!!
本当に、本当にありがとうございました!!!!!!!!
(花梨) 2019/03/16(土) 16:14
解決して良かったですね。
ついでですが・・
>では、↓ここでは何をしているかわかりますか。 >bool = myRange.Replace(Var, myDic(Var), LookAt:=xlPart)
ヘルプによると 「指定されたセル範囲内のセルの文字を示すブール型 (Boolean) の値を返」させています。
この日本語は理解できないなぁ。。
まぁ、英語でも変わりないです。 「Returns a Boolean indicating characters in cells within the specified range.」
セルにエラー値が入力されていても、Trueが返ってくる。訳が分からない仕様ですね。
(半平太) 2019/03/16(土) 16:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.