• 締切済み

EXCEL VBA を教えて下さい。

EXCEL VBA で 業務毎に(A業務、B業務、C業務)、 担当者のメールアドレスを抽出するツールを 作りたいです。 <Sheet1>    A列   B列   C列   D列   E列    氏名  メアド  A業務  B業務  C業務    111   111@aaa   to   cc   bcc    222   222@bbb   cc   bcc  to    333   333@ccc   bcc  to   cc    444   444@ddd   to   cc   bcc もしも、A業務のセルををクリックしたら、、、 Sheet2に下記のように表示するものを作りたいです。 <Sheet2> to:    111@aaa,444@ddd cc:    222@bbb bcc:   333@ccc なんとか下記まで書いてまましたが、知識が未熟な為、行き詰っています。 Sub Macro03() With Worksheets("Sheet1").Range("A1") .AutoFilter Field:=3, Criteria1:="to"   ( B列の対象メアドをカンマで連ねてコピーしたいのですがわからないです) .CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("Sheet2").Range("B2").PasteSpecial Paste:=xlValues, Transpose:=True .AutoFilter End With Worksheets("Sheet2").Activate End Sub VBAの優秀な方、 どうか教えて下さいますよう、宜しくお願い致します。

みんなの回答

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

  A     B  to:  111@aaa,444@ddd  cc:  222@bbb  bcc:  333@ccc のように出力するのなら   With Sheets("Sheet2")     For Each d In myDic.keys       j = j + 1       .Cells(j, "A").Value = d & ":"       .Cells(j, "B").Value = myDic(d)     Next   End With   Set myDic = Nothing End Sub

kkkoto2
質問者

お礼

素晴らしいです!! 前者の方に続き、本当にありがとうございます!! おふたりから理想どおりの回答を頂けて、感動しまくりです☆。 上司から頼まれたものの、どうしようかと悩んでいました。 (派遣社員なのですが、)お陰で派遣切りにならなくてすみそうです。 本当に助かりました。 今後の為にも、コードを勉強させて頂きます。 本当に有難うございました m(__)m

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

A業務~C業務の何れかのセルを選択して実行してください。 Sub Test()   Dim myDic As Object   Dim Str As String   Dim d As Variant   Dim myc As Long, i As Long, j As Long   myc = ActiveCell.Column   If myc < 3 Or myc > 5 Then Exit Sub   Set myDic = CreateObject("Scripting.Dictionary")   For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row     Str = Cells(i, myc).Value     If Not myDic.Exists(Str) Then       myDic(Str) = Cells(i, "B").Value     Else       myDic(Str) = myDic(Str) & "," & Cells(i, "B").Value     End If   Next   With Sheets("Sheet2")     For Each d In myDic.keys       j = j + 1       .Cells(j, "A").Value = d & ":" & myDic(d)     Next   End With   Set myDic = Nothing End Sub

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 外しているかもしれませんが・・・ Sheet2のA1に「to」 A2に「cc」 A3に「bcc」とすでに入っているとします。 >もしも、A業務のセルををクリックしたら、、、 とありますが、「ダブルクリックすると」にしています。 Sheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストして1行目項目をダブルクリックしてみてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i, j, k As Long Dim ws As Worksheet Dim buf As Variant Set ws = Worksheets("Sheet2") If Intersect(Target, Rows(1)) Is Nothing Or Target.Column < 3 Or _ Target = "" Or Selection.Count <> 1 Then Exit Sub j = Target.Column Cancel = True ws.Columns(2).ClearContents For k = 1 To ws.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, j) = ws.Cells(k, 1) Then buf = buf & Cells(i, 2) & "," End If Next i ws.Cells(k, 2) = Left(buf, Len(buf) - 1) buf = "" Next k ws.Columns.AutoFit ws.Activate ws.Cells(1, 1).Select End Sub ※ A・B列で分けていますが、こんな感じではどうでしょうか?m(__)m

kkkoto2
質問者

お礼

素晴らしいです!! 本当にありがとうございます!! 理想どおりの回答を頂けて、感動してます☆。 今日も図書館で調べていたのですが、 わからなくて困っていた所でしたので 本当に助かりました。 今後の為にも、コードを勉強させて頂きます。 本当に有難うございました m(__)m

kkkoto2
質問者

補足

再質問で申し訳ありませんm(__)m。 もしもSheet1において、 "to" に該当する データが存在しない場合、 Sheet2 の to(A1)の右隣 B1は空白、 cc(A2) と bcc(A3) の右隣のB2とB3には、 該当するものが表示されて、 結果は正しいのですが、途中で、 『 実行時エラー'5':   プロシージャの呼び出し、または引数が不正です。 』 とブレイクされます。 途中でマクロが止まらないよう、応急処置として、今は ws.Cells(k,2)=Left(buf,Len(buf)-1) を On Error Resume Next On Error Goto 0 ではさんでいます。 もし、良い方法がありましたら、 教えて下さいますよう宜しくお願い致します。

  • LHS07
  • ベストアンサー率22% (510/2221)
回答No.1

to   444@ddd は表示しなくていいのですか?    

kkkoto2
質問者

お礼

to の後には、111@aaa と 444@ddd をカンマで連ねて表示させたいのです。 そうゆう風に出来るものなのでしょうか?。 もし、おわかりでしたら、教えて下さいますよう宜しくお願い致します。

関連するQ&A

  • エクセルで色付けのVBAを作成してるのですが・・。

    エクセルでレンジ値の大きさにより色付けをする(下の条件)VBAを作りたいのですが うまく走りません。お手数とは思いますがご教授お願いします。 シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば、 シート "bbb" のレンジ "B1" の文字を黄色にして、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3<A2<A1" とだんだん大きくなれば、 シート "bbb" のレンジ "B1" の文字を緑色にして、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3,A1" が空白の場合、シート "bbb" のレンジ "C1" の文字を赤色へ シート "aaa" のレンジ "A3,A2,A1" が上の条件に合わなければ、 シート "bbb" のレンジ "B1" の文字を黒色にし、シート "bbb" のレンジ "C1" の文字を赤色にして終わる。 というようなプログラムで下記のように作りました。 ("A1,A2,A3"に入る値は50~100まで) ----------------------------------------------- Sub 注意() Dim v506Hi, v506Lo, v506a, v506b As Single v506a = Worksheets("aaa").Range("A3") v506b = Worksheets("aaa").Range("A1") If Worksheets("aaa").Range("A3") <> "" Then GoTo Sub1 ElseIf Worksheets("aaa").Range("A1") <> "" Then GoTo Sub1 Else Worksheets("bbb").Range("B1").Font.Color = RGB(0, 0, 0) GoTo sub2 Sub1: Select Case v506a Case Is < Worksheets("aaa").Range("A2") v506Hi = Worksheets("aaa").Range("A2") v506Lo = 0 Case Is > Worksheets("aaa").Range("A2") v506Lo = Worksheets("aaa").Range("A2") v506Hi = 500 Case Is = Worksheets("aaa").Range("A2") v506Hi = 500 v506Lo = 0 End Select Select Case v506b Case Is > v506Hi Worksheets("bbb").Range("b1").Font.Color = RGB(255, 255, 0)黄色 Case Is < v506Lo Worksheets("bbb").Range("b1").Font.Color = RGB(0, 255, 0)緑 Case Else Worksheets("bbb").Range("b1").Font.Color = RGB(0, 0, 0) End Select sub2: Worksheets("bbb").Range("c1").Font.Color = RGB(255, 0, 0)赤 End If End Sub ----------------------------------------------------------- プログラム初心者で間違いだらけとは思いますが、よろしくお願いいたします。

  • EXCELのVBAで空白列を削除して左づめにできますか?

    いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例)  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|   |BBB|CCC|DDD|EEE| 3|AAA|   |CCC|DDD|EEE| 4|AAA|   |CCC|   |EEE| 5|   |   |   |DDD|EEE|     ↓  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD|   |EEE| 3|AAA|CCC|DDD|   |EEE| 4|AAA|CCC|   |   |EEE| 5|DDD|   |   |   |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

  • VBAで特定の値がある行を連続コピーしたい

    Excel 2003 OS XP Professional SP3 VBAは自分でコードは組むことはできませんので見よう見まねでやっているレベルです。 A B C D E の列があり、行の1行目はタイトル行になっています。  A  B  C   D  E ***  ***  ***  ***  *** ’  AAA  BBB  CCC  DDD 111 222 333 '   EEE  FFF  GGG  HHH '   III  JJJ  KKK  LLL 444 555 '   MMM  NNN  OOO  PPP A列にカンマがある行にはB~E列に値が入力されていて、A列にカンマ以外の値が入力されている 場合にはB~Eには何も入力されていません。 A列にカンマ以外の値の時、カンマのある行のデータを次のカンマのある行までフィルハンドルをドラッグしてコピーするよう にしたいです。  A  B  C   D  E ***  ***  ***  ***  *** ’  AAA  BBB  CCC  DDD 111  AAA  BBB  CCC  DDD 222  AAA  BBB  CCC  DDD 333  AAA  BBB  CCC  DDD '   EEE  FFF  GGG  HHH '   III  JJJ  KKK  LLL 444  III  JJJ  KKK  LLL 555  III  JJJ  KKK  LLL '   MMM  NNN  OOO  PPP   sub 連続コピー() Dim r As Long Dim n As Long r = 2 n = r + 1 Do While Worksheets("sheet1").Cells(r, 1) <> "" If Worksheets("sheet1").Cells(r, 1).Value = Worksheets("sheet1").Cells(n, 1).Value Then r = n n = n + 1 Else Range(Cells(r, 2), Cells(r, 5)).Copy Range(Cells(n, 2), Cells(n, 5)) n = n + 1 End If Loop End Sub 自分なりに考えてみましたが、ぜんぜん動きません。 どなたかご教授をお願いします。

  • エクセルの文字処理

    以前に同じ様な質問があったかも知れませんが、探しきれなかったので教えてください。 A1~A4の4つのセルに以下のスペースが入った文字列が入っていた場合 A1|AAA A2|AAA BBB A3|AAA BBB CCC A4|AAA BBB CCC DDD    A   B   C   D  1|    AAA 2|AAA BBB 3|AAA BBB CCC 4|AAA BBB CCC DDD という具合にしたいのです。 条件は  ・セル内にスペースで区切られない文字列があった場合には、B列に入れる  ・それ以外はスペースで区切って、A列B列C列D列に入れる  ・文字数は3文字固定ではなく全角半角が混在 以上です。すいません宜しく願いします。

  • エクセルのマクロについて教えて下さい。

    エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、           A         B   C  D   E  F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、     A B  C  D   E   F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。

  • Excel VBAについてご教ください

    いつも、こちらのサイトをみながら、VBAを勉強させていただいているのですが、 今回、自分のやりたいことが見当たりませんでしたので、ご教示いただければと思います。 やりたいことは、 (1)「エリア1」にある名称ごとに同じBookの別シートに振り分け (2)各シートで「累計売上」順(降順)に並べ替え の2つの作業を同時に行いたいのです。 また、 (1)には、あらかじめ決まったシートが用意されているので、 そのシートの決められた範囲にデータを移したいのと、 データを貼り付ける前に、前に残っている前回のデータを削除してから、同場所に貼り付けを行いたいです。 ちなみに、エリアが3つあるので、シートも3枚あります。 自分でも、いろいろとやってみて、 下記のようなコードを書いたのですが、あまりにも重くて、動きがわるかったため、 シンプルかつ、軽やかに動くコードの書き方をお教えいただければと思います。 よろしくお願いいたします。 Sub Macro2() Application.ScreenUpdating = False With Worksheets("元データシート") .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京前", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("前 品別").Range("AJ5") .AutoFilterMode = False .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京中", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("中 品別").Range("AJ5") .AutoFilterMode = False .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京後", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("後 品別").Range("AJ5") .AutoFilterMode = False End With Application.ScreenUpdating = True MsgBox "各地区シートにデータを振分けました。" End Sub 【元データの形式は以下のような形になってます。】     A    B    C    D     E       F      G      H      I     J   4  コード S番号 S名称  S名  月間個数 月間売上 累計個数 累計売上 エリア1  エリア2 5  4237  4025  AAA  あああ   3      150     7      350    京後    後A    6  6769  4025  AAA  いいい   2      100     5      250    京中    中B 7  3453  4028  BBB  ううう    5       50     5       50    京後    後C 8  4252  4029  CCC  えええ   1      110     9      990    京前    前A 9  3564  4027  DDD  おおお   0       0      8      80    京前    前A 10 8035  4022  EEE  かかか   1       30     2      60     京中    中B 11 9225  4026  EEE  ききき    2       40     3       60    京後    後A 以下5000行ぐらいデータが続きます。

  • (EXCEL)重複したデーターの抽出について

    EXCEL2003 シート「sheet1」に下記のようなデーターがあります。 <sheet1>   A   B   C  D 1 りんご 青森 AAA BBB 2 みかん 愛媛 CCC DDD 3 みかん 青森 AAA BBB 4 りんご 青森 AAA BBB 5 みかん 愛媛 CCC DDD A列とB列が同じ値のものをシート「sheet2」に重複しているデーター は1行だけになり、E列にカウントした数が入力されるようにしたいです。 (C列やD列は同じ値でなくてもA列とB列が同じ値の時にカウントして抽出したいです) <sheet2>   A   B   C  D   E  りんご 青森 AAA BBB  2  みかん 愛媛 CCC DDD  2   ご教示のほどお願いします。

  • Excelの関数に詳しい方、お願いします。

    わかりづらい説明かもしれませんが、よろしくお願いします。 例として、 AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF ・ ・ ・ といった文字列がエクセルの先頭列A1~A100までずらりと並んでいるとします。 各アルファベットには任意の数字(日付など)が入るとして、この並んだ百件のデータからCCCの部分の最大値を表示するための適切な関数があれば教えていただけないでしょうか? 現在少々急いでいるため言葉足らずで申し訳ありませんが、よろしくお願いいたします.

  • 【少し急いでます】エクセルについて教えてください!

    Excel2000を使っています。 A列に重複するデータがあり、B列に別データがあります(20000行強) 例)     A  B 1  001 aaa 2   001 bbb 3   001 ccc 4   002 aa 5  002 bb 6  003 aaa 7  003 bbb 8  004 ddd 9   004 eee 10  005 aa 11  006 bbb A列で重複する001は3行あり、重複しているデータは1行にまとめてB列のaaa、bbb、cccをつなげたいです。(わかりづらくてすみません) 例)     A      B 1  001  aaa・bbb・ccc 2  002   aa・bb 3  003  aaa・bbb というようにまとめたいです。 どのような方法がありますでしょうか? よろしくお願い致します。

  • エクセルVBAでの文字列抽出

    エクセルVBAで文字列を検索して、検索した文字列を他のセルへ出力する方法がわかる方法を探しております。状況を図で説明すると、 A1セル:aaa\bbb\item1\ddd A2セル:aaa\bbb\ccc\item2\ddd A3セル:aaa\bbb\ccc\ddd\item3\eee このような状態からitemを検索して、B1セルに B1セル:item1 B2セル:item2 B3セル:item3 と表示させたいです。エクセルVBA初心者な者でRegExpを使うのかな、というところまではたどり着きましたが、そこから先にすすめません。 何か良い方法をご存知の方、教えていただきたいです。よろしくお願いいたします。