• ベストアンサー

エクセルでのVBA(マクロ)が出来ますか?

帳票の整理で困っています。 以下のようなデータがシート1に入力されています。   A  B   C    D   E    F  1名前 住所 請求書 納品書 領収書 到着確認書 2山田 東京  ○       ○ 3井上 千葉      ○   ○    ○ 4植田 大阪      ○   ○ 5境  秋田  ○   ○ 6大田 沖縄  ○   ○   ○    ○ 7野原 埼玉          ○ データの”○”は書類が確認済で、空白は未確認あるいは未到着です。 "C"列から"F"列の中で1つ以上空白のあるデータを検索して別シート2へそのままコピー出来るマクロ、そしてシート2に表示されたデータで空白となっている"C"列から"F"列の項目名(請求書等)をシート3に用意してあるあいさつ文の書類名入力セル(ここではE10としておきます)に記入できるマクロがさっぱり分かりません。 データ件数は1000件以上になるかと思います。 どなたかお助けください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

ja7awuさん、Thanks hirosatonn さん、 c.Resize(, 6).Copy として、6列を取得していますから、「A列のみしかコピー」されない、というのは、コードを見る限りでは、初歩的なコードですから、そのようなことは考えられません。何か、私の書いたコードを変更されたか、A列の右隣-B列移行が、隠し列になっているか、などだと思います。 ただし、念のために、加筆してみました。 Sub FindBlank1() Dim Rng As Range Dim i As Long 'Sheet2のフィールド行(名前,住所..)は、1行目にあるとします。 With Sheet1 .Activate i = 2 '2行目から Set Rng = .Range("A1", .Range("A65536").End(xlUp)) For Each c In Rng  If Application.CountA(c.Offset(, 2).Resize(, 4)) <> 4 Then    'A列から、A列を含めて6列取得し、Sheet2にコピー    c.Resize(, 6).Copy Sheet2.Cells(i, 1).Resize(, 6)    i = i + 1  End If Next End With End Sub Sub FildBlank2() Dim Deliveries As Variant Dim i As Long, j As Long Dim DataRows As Long Dim Result As String '配列式に格納 Deliveries = Array("請求書", "納品書", "領収書", "到着確認書") With Sheet2 'Sheet2 をオープン .Activate DataRows = Range("A2", Range("A65536").End(xlUp)).Rows.Count + 1 For i = 2 To DataRows '2行目から  For j = 3 To 6 '3列目~6列目  If .Cells(i, j).Value = "" Then '調べたセルの文字列0の長さだったら、    '配列より、取り出す    Result = Result & ";" & Deliveries(j - 3)  End If  Next j  If Result <> "" Then    '結果が空でないなら、H列に貼り付け    .Cells(i, 7).Offset(, 1).Value = Mid(Result, 2)    Result = ""  End If Next i End With End Sub Sheet3 の"E10" に出すのは、関数などで行ってください。 つまり、"E10" に、全て出すということはありえませんから、INDEX 関数などを使って、Sheet2 から、引き出すのが良いと思います。 =INDEX(Sheet2!A2:H17,H1,8) H1 に、数字を入れます。 現実の問題として、1000件以上ですから、この後に、印刷という作業が加わるものだと思います。しかし、[教えて!goo]では、書き込みの際の物理的な制約もありますので、専門のExcel のVBAの掲示板なりでお尋ねになるか、goomaniaさんの#2 の内容を参考にしてください。ここら辺が限界です。

hirosatonn
質問者

お礼

色々とありがとうございました。そしてすみませんでした。コードをちょっといじっていました。 関数を使って頑張ってみます。

その他の回答 (3)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

> そしてA列のみしかコピーされません。 コードをそのままコピーして使いましたか? 括弧の中の , が落ちている可能性がありますよ。 後半の件は、山田さんの場合は、それでいいとしても、次の井上さんとかは、 どうするのですか? 1つでも○が無い人について挨拶文を差込印刷したい といことと違うのですか? もうちょっと、解るように書きましょう。 横レス 失礼 !!

  • goomania
  • ベストアンサー率56% (84/149)
回答No.2

質問者さんのVBAについてのご理解の程度がわかりませんが、ご自分でVBAプログラムをある程度作成できる実力がないと、この「教えてgoo」サイトで質問者さんのご希望をかなえるVBAプログラムを公開して欲しいというご要望になってしまいます。 ご質問の内容から推察すると、請求書・納品書・領収書の未発行先について、挨拶文とともに発送する事務を合理化するためのプログラムだと思いますが、これをそのまま公開することはプログラムも大きいと考えられますので基本的に無理があります。 最終的な目的が「EXCELのVBAマクロを使って請求書、納品書、領収書の発行を管理する」ことだとすると、以下のサイト http://www.vector.co.jp/soft/win95/business/se251819.html?site=n などからEXCELのVBAマクロを使ったプログラムをダウンロードして研究してみるのはどうでしょう。 ご自分である程度作成できるようになったら、プログラムがご自分の望んでいる動作にならない場合などについてお尋ねいただいたほうがより具体的なアドバイスが返ってくるように思います。 参考URLにもその他のEXCELマクロを使用した販売管理ソフトなどがありますのでご覧下さい。

参考URL:
http://www.nifty.com/download/win/business/hanbai/index.htm
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

>"C"列から"F"列の中で1つ以上空白のあるデータを検索して >別シート2へそのままコピー出来るマクロ、 Sub FindBlank() Dim Rng As Range Dim i As Long 'Sheet2のフィールド行(名前,住所..)は、1行目にあるとします。 i = 2 Set Rng = Range("A1", Range("A65536").End(xlUp)) For Each c In Rng  If Application.CountA(c.Offset(, 2).Resize(, 4)) <> 4 Then    'シート2にコピー    c.Resize(, 6).Copy Sheet2.Cells(i, 1)    i = i + 1  End If Next End Sub こちらは意味が分かりません。 >シート2に表示されたデータで空白となっている"C"列から"F"列の項目名(請求書等)をシート3に用意してあるあいさつ文の書類名入力セル(ここではE10としておきます)に記入

hirosatonn
質問者

お礼

ありがとうございます。 コードを実行させたところ、空白の無いデータもシート2へコピーするのですが...そしてA列のみしかコピーされません。シート2へのコピーは行全部のデータをしたいのですが。..

hirosatonn
質問者

補足

すみません。表現方法が悪くて・・・ たとえば   A  B   C    D   E    F  1名前 住所 請求書 納品書 領収書 到着確認書 2山田 東京  ○       ○ 上の例ですと "A2"の山田さんですと"D1:納品書"と"F1:到着確認書"が未確認(未到着)ですので、シート3(あいさつ文)のセル"E10"に"納品書;到着確認書"という文言(空白の部分が1つであれば、その書類名)を入れることなのですが・・

関連するQ&A

  • エクセルでのVBA(マクロ)

    以前Wendy02さまに 以下のようなデータがシート1に入力されているもので   A  B   C    D   E    F  1名前 住所 請求書 納品書 領収書 到着確認書 2山田 東京  ○       ○ 3井上 千葉      ○   ○    ○ 4植田 大阪      ○   ○ 5境  秋田  ○   ○ 6大田 沖縄  ○   ○   ○    ○ 7野原 埼玉          ○ データの”○”は書類が確認済で、空白は未確認あるいは未到着です。 "C"列から"F"列の中で1つ以上空白のあるデータを検索して別シート2へそのままコピー出来るマクロを教えていただいたのですが、 A列に受付番号(500件)を先に入力しておいて(一応自分でマクロを組んで)同じ処理をするとデータ(B列:名前)が入力されていないものまで検索結果としてカウントされます。 Sub FindBlank1() Dim Rng As Range Dim i As Long 'Sheet2のフィールド行(名前,住所..)は、1行目にあるとします。 With Sheet1 .Activate i = 2 '2行目から Set Rng = .Range("A1", .Range("A65536").End(xlUp)) For Each c In Rng  If Application.CountA(c.Offset(, 2).Resize(, 4)) <> 4 Then    'A列から、A列を含めて6列取得し、Sheet2にコピー    c.Resize(, 6).Copy Sheet2.Cells(i, 1).Resize(, 6)    i = i + 1  End If Next End With End Sub >i = 2 '2行目から の前に組めば出来る筈だと思うのですが? お助けください。

  • エクセル マクロ VBA

    エクセルのマクロについて質問です。 『集計』というブックの『集計開始』というシートに     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 コメント  空白     空白   3行目 空白   空白     空白 4行目 商品名  支店     個数  5行目 空白   空白     空白 6行目 空白   空白   コメント1 7行目 空白   空白     空白 8行目 空白   空白   コメント2 9行目以降    上記のデータ(見出しを除く)の繰り返し というデータが入っています。 B列の中に『AAA』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 C列の中に『B』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 (今は、手作業で編集→置換→検索する文字列の中に『B*』と入力し、 置換後の文字列を空白にしてすべて置換ということをやっています。)                            ABC列(データーの入っている行まで)の空白を含む行を一括削除し、 以下のような形にしたいのです。     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 商品名  支店     個数  3行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

  • エクセル VBA マクロについて

    初めまして。 以下のようなマクロを組みたいんですが可能でしょうか?  A     B     C    D    E    F 東京   足立区 みかん  10   5   50       葛飾区 みかん  20   3   60        港区  りんご  30   1   30 小計                       140 ( 空白行   ) 愛知  名古屋市 みかん  10   5   50      東海市    もも   10   5   50 小計                       100 上記のようなデーターシートがあります。 Dには数字が入ってるんですが、 ここに係数をかけたいんです。 たとえば、=10*1.07 とか (1)元の値に係数かける式をセルに入れるマクロはあるんでしょうか? (2)この係数を別シートのセルで入力したいんですが セルを参照できますか? (3)みかん、もも、りんごの列を検索して、  それに対応した係数かけるマクロはあるんでしょうか? 処理速度は、とくにはこだわりません。 ご指導おねがいいたします。

  • エクセルのVBAマクロについて

    エクセルのVBAマクロについて、添付のような物を考えているのですが、宜しくお願いします。 B3~E15に関数を入れて、TRUE となったデーターを表示 させるまでは出来たのですが、このデーターをF~I列へ上から順に (空白行は詰めて)順次記録して行きたいのです。 B3~E15に表示させるデーターは、別シートから抽出し、 切り替えますので、結果を表示させたら、ボタンを押して記録し、 再度別データーを入れたらその下に記録して行くような仕組み を考えております。 宜しくお願いします。

  • Excelのマクロを教えてください。

    Excelのマクロを教えてください。 Sheet1 F列(商品) F2テレビ、F3DVD、F4携帯電話、サプライ、、、F32まで商品あり。 I列~N列の1段目(人*増える場合あり) I1佐藤、J1高橋、K1田中、L1中村、、、 I2~N32まで、1、2、3と個数が入力されています。 A列~E列とG列とH列は今回の処理に不要なデータがいます。 これをSheet2に A列に人、B列に商品、C列に数 例) A1 佐藤、B1 テレビ、C1 1 A2 佐藤、B2 DVD 、C2 3 A3 高橋、B3 携帯電話、C3 2 のように、書き出すマクロを教えていただけませんか? 別にマクロでなくても、Excel2007までの機能でできることであればそれでもいいです。 丸投げして申し訳ありません。

  • 【Excel VBA】ThisWorkbook モジュールのマクロ

    Excel2003を使用しています。 39枚のシートから成るBook1のThisWorkbook モジュールに、C列に“○月計”と入力されたら、その行のE列、F列、G列へ数式を入力するコードを書いています。 現在は、それぞれのシート(39枚のシートのうち3枚を除く36枚)のC列最終行から2行下のセルへ“○月計”と手入力していますが、マクロで“○月計”と入力されるようにすれば、ThisWorkbook モジュールに書いているコードも実行されて、数式の入力までマクロで処理できるのかな?と思い、試しに、36枚それぞれシートのC列最終行から2行下のセルへ“○月計”と入力されるようコードを書いてみました。 …が、そうではないのか、それぞれのシートのC列最終行から2行下のセルへ“○月計”と入力されるものの、E列、F列、G列へ数式は入力されません。 せっかくなので、できることなら数式の入力までマクロで処理したいのですが、どのようにしたらThisWorkbook モジュールに書いているコードまで実行されるのでしょうか? よろしくお願いします。

  • エクセルVBA初心者です。マクロを組んでください。

    エクセルVBA初心者です。組んで欲しいマクロがあります。 Sheet 1に13桁を入力するセル sheet 2に検索したいデータ 手順としては、 Sheet 1のセルにデータを入力 →13桁以上でマクロが開始(されるように設定します) →Sheet 1のセルと同じ数列をSheet 2の列Aから検索 →該当のセルを含む行をSheet 3にコピー →Sheet 1の入力セルの少し下にもコピー (確認用) というのを一回一回ずつやりたいです。 できれば作業中マウスやキーボードを触りたくないので、そのために、マクロの終わわりには入力セル内の消去、マクロの始まりには確認用でコピーした行の削除もつけて下さい。 検索するSheet 2には同じデータが含まれているので、出来ればひとつずつSheet 3にコピーしたいので組み込んで頂けると幸いです。 よろしくお願いいたします。

  • エクセルVBAの入力について

    "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)すべてコピーして、 貼り付ける場所が"Sheet2"のA1:Z10の範囲内で、 A1はB列、C1はG列、F1はH列、G1はZ列の空白セルに上詰めで貼り付ける。 なおF、G、H、Z列以外の列には値が入力されていたり空白もあります。 また同時に、 "Sheet1"のA1、C1、F1、G1の値(計算結果のみ)の内でA1とF1のみコピーして、 貼り付ける場所が"Sheet3"のC1:Y10の範囲とC13:Y23範囲内で、 A1はC列、F1はY列の空白セルに上詰めで貼り付ける。 なおC、Y列以外の列には値が入力されていたり空白もあります。 またC11:Y12の範囲内にはすべて値が入力されています。 よろしくお願いします。

  • エクセルのマクロでこういう場合は?

    エクセル97です。 Sheet1の E3:J29 に表があります。 E列、F列は文字列、G列は数値、H~J列には式が入っています。 この表の G列の値が空白や0でない行だけをコピーして、Sheet2 のB2 以下に切れ目なく表の「値」を貼り付けるにはどうのようなマクロを書けばいいのでしょうか?(G列が空白や0の行はSheet2の表では一切無視され、空白行ができないようにしたいのです。) よろしくお願いします。

  • エクセルのマクロ(VBA)について質問です。

    お世話になります。 エクセルのマクロ(VBA)について質問があります。 下記、わかりにくいと存じますが、お力添え下さい。 ある表があります。 項目としてA列「名前」B列「連絡先」C列「順番」とんでE列に 「乱数」があります。 2行目にこれら項目名が並んでおり、3行目から34行目までは データ入力範囲になります(32名入力出来る。1行目は表のタイトルです) 入力したデータを順不同に並べたく、「順番」項目は乱数を用いた数字を入力させます。 ここから、マクロの登録をします。 ~↓登録中↓~ ・「乱数」項目の1番上(E3)から一番下(E34)までドラッグ  (範囲指定)し、右クリック→コピー ・「順番」項目の一番上(C3)で右クリック→”形式を選択して貼り付け” ”値”にチェックを付けて「OK」 ☆「順番」項目の一番上(C3)から「名前」項目の一番下(A34)まで ドラッグ(範囲指定)し、”昇順で並べ替え”ボタンを押す ~ここまで~ (乱数は、毎回変化してしまうのを防ぐ為、別項目から引っ張ってきて 値だけをコピーするようにしています) このようにマクロを登録しました。 しかし、毎回32名を入力するわけではなく、時には32名未満の入力をする場合があります。 別のセルF40に、COUNTA関数より取った「名前」項目に登録されている数を表示させているのですが、 ☆部分の処理にてこの数だけ範囲指定して並べ替えたいのです。 (セルC3から登録されている人数分だけ範囲指定したい、ということです。20名だけ登録されていれば、 セルC3からセルA22を範囲指定する。指定した部分だけを並べ替える) 32名未満の時、乱数に元づく順番で並べ替える際、データの入って いない行も順番に並んでしまうのですが、空白の行はそのままにし、 データの入っている行だけを上(セルA3)から詰めて並べたいのです。 VBAの編集で、COUNTA関数の結果の数字を変数に代入して使用したいのですが、 そのやり方がわかりません。 どなたかお知恵をくださいますよう、お願い致します。 (わかりにくい記述なので、必要に応じて補足させて頂きます。)

専門家に質問してみよう