[[20190316113342]] 『VBA 条件による置換』(花梨) ページの最後に飛ぶ

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

 

『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:05

>わかりません。

そういうことであれば、申し訳ございませんが、
わたしには、解決に導くことができそうにありません。
他の方からの回答をお待ち下さい。

(マナ) 2019/03/16(土) 13:55


畏まりました。お付き合いありがとうございました。
(花梨) 2019/03/16(土) 14:00

 弄ってみました。ただし、
 追記した部分以外の事は全く考えてないので、目的通りの結果を保証するものではありません。
 その点は重々ご承知おき下さい。あしからず^^;

    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.