[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『最長文字列検索と空白削除』(万年太郎)
下記のDBをVBA処理しようと思うのですが、アイデアが浮かびません。 どなたか知恵を貸して下さい。
A B C 1 部署コード 部署名 担当者 2 1001 総務部 山田太郎 3 1002 営業部1 石井恵子 4 1003 営業部2 石川一、田村一郎 千葉二郎、福島二郎 5 1004 経理部 伊藤一郎 6 1005 技術部 山田三郎
C列に担当者名が書かれており、4行目のみ4名の名前が列記されている他はせいぜい1名 〜2名なので4行目のせいでc列が長くなってしまいます。 それを下記の様に処理して短く出来ないかな、と思っています。 上記はサンプルの為、6行ですが、実際は200行を超えており最長文字列行を探すのが大変です。 @文字列が一番長い行を自動検索する A文字列が最も長い行の担当者で空白文字列をカットして”、”をつける BColumns("C:C").EntireColumn.AutoFit を使用してC列を短くする
Window XP,Excel2003
最終的にはどの様に成ればよいのですか? >石川一、田村一郎 千葉二郎、福島二郎 の様に、間にスペースが含まれている行は スペースを取り除き「、」に変更 されれば良いのでしょうか?
でも、そう言う事なら >(1)文字列が一番長い行を自動検索する 必要は無いですよね
(1)で見つかった「一番長い行」に関してのみ スペースが「、」に成れば良いのでしょうか?
>最長文字列行を探すのが大変です。 最長文字列行は、D列にでも LEN関数でC列の文字数を数え E1セル等に =MAX(D:D)とすれば D列の最大値が求まります。 D列にオートフィルタをかけて E1セルと 等しい値の物のみ表示させれば 簡単に見つかりそうに思います。
でも、どの様な事をなさりたいのか良く分からないので・・・。 例えば、A1セルに「石川一、田村一郎 千葉二郎、福島二郎」 が入っている場合、B1セルに =SUBSTITUTE(TRIM(A1)," ","、") の式を入れると「石川一、田村一郎、千葉二郎、福島二郎」 の様に表示させることが出来ますが。 (空白が全角スペースの場合です。)
また、最長文字列行にのみ実行したい場合は 文字数を数える作業列を作れば良いように思います。
(HANA)
マクロでするなら、こんな感じかな? 2人以上 スペースがあると判断しています。 (SHIOJII) Option Explicit
Sub test() Dim r As Range Dim myVal As String
For Each r In Range("C2", Cells(Rows.Count, 3).End(xlUp)) myVal = Replace(r.Value, " ", " ") If InStr(myVal, " ") > 0 Then myVal = WorksheetFunction.Trim(myVal) r.Value = Replace(myVal, " ", "、") End If Next Columns("C:C").EntireColumn.AutoFit End Sub
HANAさんの数式をそのままで..
Sub test() Dim x As String With Range("c2", Range("c" & Rows.Count).End(xlUp)) x = .Address .Value = Evaluate("if(" & x & "<>"""",substitute(trim(" & x & "),"" "","、"),"""")") .EntireColumn.AutoFit End With End Sub (seiya)
HANAさん、SHOJIIさん、seiyaさんありがとうございます。 SHOJIIさんのテストではうまくいったのですが、seiyaさんのでは .Value = Evaluate("if(" & x & "<>"""",substitute(trim(" & x & "),"" "","、"),"""")") のところでコンパイルエラーとなりました。記述のどこに問題があるか判らず、悪戦苦闘中です。 それとEVALUATEをEXCEL学校の全文検索で検索したら、seiyaさんが投稿した [[20070212134849]] Evaluate Method の研究が出てきましたが、この応用ですか? Evaluate,と言うメソッドは初めて見ました・・・・ @__@ (万年太郎)
" が抜けていました。 .Value = Evaluate("if(" & x & "<>"""",substitute(trim(" & x & "),"" "",""、""),"""")") ^^^^^^^^
に変更してください。 (seiya)
seiyaさん、うまくいきました。ところで、HANAさんの数式をそのままで..というコメントは HANAさんの投稿の中にある =SUBSTITUTE(TRIM(A1)," ","、") の部分を
.Value = Evaluate("if(" & x & "<>"""",substitute(trim(" & x & "),"" "",""、""),"""")")
に記述を変えただけですか?もし、そうであれば" & x & " の部分の意味を説明頂けませんか? (><) 万年太郎
HANA さんの数式は =SUBSTITUTE(TRIM(A1)," ","、") ですよね? vba で上記数式をセルに入力する際には、 "=SUBSTITUTE(TRIM(A1),"" "",""、"")" のようになります。
変数x には B2:Bの最終列のアドレスが格納されています。 例えば B2:B100 として substitute(trim(B2:B100),"" "",""、""),"""") アドレス部分をxに置き換えると substitute(trim(" & x & "),"" "",""、""),"""") になります。 数式を利用してその結果をEvaluateメソッドで配列を作成する場合は、まず仮想配列を作成する必要があります。 (関数を使用しない、または使用関数が配列関数であればその必要はありません) その部分が If(B2:B100<>"", です。 If(Rows(B2:B100) でもOKです。 その配列に数式の結果を挿入しています。 参考にしてください。 (seiya)
なるほど、よーわかりました。Seiya先生、ありがとうございます! m(__)m m(__)m (万年太郎)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.