• ベストアンサー

マクロのつくり方がわかりません。

以下はEXCELです。 A1のabcを同ブロックの13-07-31の 下(A5)にコピーするマクロをつくりたいのですが。 A7はA9にしたい。 -------A--------B 1-----abc------123 2---13-07-01--(空白)- 3----(空白)----456 4---13-07-31--(空白)- 5----(空白)---789 6-------空白行------- 7-----abc------123 8---13-07-31--(空白)- 9---(空白)---789 10-------空白行------- 以下続きます。

  • tsufu
  • お礼率27% (41/150)

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.6

補足とapril21さんの横レス(^o^)を参考にし、データとニラメッコして、下記マクロを作ってみました。 質問のデータ並びは、 (1)AとBが空白の行でページが分かれる (2)同一ページでは取引先は1度のみ印刷し同一日付も印刷しない。 この条件でデータを眺めるとうまく理解できます。ただ、印刷イメージを画面出力したものなら1頁の固定行数に対する残り行は空白行で埋めると思うんですが・・・これが不明。そこで、 (3)質問のために余分な空白行を削除した。 としてみました。できたのが下記で、質問の形式の並びを、取引先、日付、残高に並べなおします。印刷の逆関数みたいなものですね。 (1)、(2)までならそのままで、もし(3)が当たっていれば、PageMax = 1 を1頁の印刷行数に変えてみて下さい。空白行を操作しなくてもデータをきれいに並べ直すと思います。 かなり独断で想定(想像)しています。参考程度にして下さい。 標準モジュールに貼り付け、Matome2を実行。 Public rg As Range '基準セル(A1) Public torihikisaki As String '取引先 Public hizuke As String '日付(文字列として読み込み) Public zandaka As Long '残高 Public rw As Long '行カウンタ(読み込み用) Public wrRow As Long '行カウンタ(書き出し用) Public KuuhakuGyo As Integer '空白行カウンタ Public Const PageMax = 1 '1ページ行数 これを印刷行数にしたら!? Public Sub Matome2()  Set rg = Range("A1") '基準位置  wrRow = 0: rw = 0: KuuhakuGyo = 0: Yomikomi rw  With rg   While KuuhakuGyo < PageMax    If zandaka <> 0 Then     Kakikomi 'データを書き込む     rw = rw + 2     While Not (.Offset(rw, 0) = "" And .Offset(rw, 1) = "")      If .Offset(rw, 0) <> "" Then hizuke = .Offset(rw, 0)      If .Offset(rw, 1) <> "" Then zandaka = .Offset(rw, 1): Kakikomi      rw = rw + 1     Wend    End If    rw = rw + 1: Yomikomi rw '次のブロック   Wend  End With End Sub 'データを読み込む(Sub) Public Sub Yomikomi(rowNo As Long)  With rg   torihikisaki = .Offset(rowNo, 0)   hizuke = .Offset(rowNo + 1, 0)   zandaka = .Offset(rowNo, 1)   If torihikisaki = "" Then KuuhakuGyo = KuuhakuGyo + 1  End With End Sub 'データを書き出す(Sub) Public Sub Kakikomi()  With rg   .Offset(wrRow, 3) = torihikisaki   .Offset(wrRow, 4) = hizuke   .Offset(wrRow, 5) = zandaka  End With  wrRow = wrRow + 1: KuuhakuGyo = 0 End Sub

tsufu
質問者

お礼

ありがとうございます。 元データを簡略化して説明したので、 マクロに若干の修正が必要なようですが、 勉強いたします。 ありがとうございました。

その他の回答 (5)

  • april21
  • ベストアンサー率42% (91/216)
回答No.5

■訂正 E2に =IF(TYPE(MID(A2,SEARCH("??-??-??",A2,1),LEN(A2)))=16,E1,A2) だとABCの最初の日付が違ってしまいます。 (同じ日付だったので見た目気がつきませんでした^_^;) E2に =IF(TYPE(SEARCH("??-??-??",A2,1))=16,IF(AND(A2<>"",A3<>""),A3,E1),A2) こんな感じで都合の悪い点は条件を追加してあげれば良いと思いますので 適当に変更してください。m(__)m

tsufu
質問者

お礼

ありがとうございます。 勉強して理解します。

  • april21
  • ベストアンサー率42% (91/216)
回答No.4

>>外部データから取り込む際に振り分けてしまってはどうでしょう >何か本をご紹介賜れば幸甚です。 何の本でしょう?VBAのでしょうか?でしたら、VBAにヘルプがあるので 本は持っていないのですみませんがお力にはなれません。 本屋さんに行って必要なことが載ってるかどうか確かめて購入された方が 良いのでは? >ホストのデータを帳票として画面に出して、その画面を >ベースにデータとして取り込んだものです。 これだけではちょっと分からないので例題を関数で振り分けてみますね。 例題を一行ずらして(A2、B2が一行目)にして 2コ目のabcをABC(分かりやすいように)に変更。 D2に =IF(AND(A2<>"",A3<>""),A2,D1) E1に =A3 E2に =IF(TYPE(MID(A2,SEARCH("??-??-??",A2,1),LEN(A2)))=16,E1,A2) F2に =IF(B2="","",B2) で、D2からF2まで選択してD11までフィルドラッグ 選択して「データ」-「オートフィルタ」で残高の▼をクリックして 「空白以外のセル」をポイント。 下記のようになってるはずなのでコピーして適当な所に貼付け。 abc 13-07-01 123 abc 13-07-01 456 abc 13-07-31 789 ABC 13-07-31 123 ABC 13-07-31 789 関数ですからどういうことをしてるか分かりますよね? 分からない関数はヘルプで調べてみてください。 意味がわかればご自分で変更して使えると思います。

  • april21
  • ベストアンサー率42% (91/216)
回答No.3

nishi6さん こんばんわ^^ ちょっと横レス失礼します。m(__)m >また、データの持ち方が一行になく行列に持っていますので苦労しています。 データベースのデータをEXCELで取り込んで苦労されてるのでは? 推測があってるなら見た感じでは文字列、数値、日付のデータのように思われる ので外部データから取り込む際に振り分けてしまってはどうでしょう? その方が簡単だと思いますが・・・。 では、(^^)/~~~

tsufu
質問者

お礼

その通りです、Excelで取り込んで苦労しています。 dataが一行に並んでいて 例)取引先  日付   残高   QQQ  YYMMDD 111111 であればexcelでもアクセスでも何とか使えるのです が、縦に並ぶと手も足もでません。 >外部データから取り込む際に振り分けてしまってはどうでしょう 何か本をご紹介賜れば幸甚です。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

>設定では先頭の文字のコピーにしましたが、その一行下の場合はどうでしょうか? 下記のように若干変更すればできます。13-07-01を貼り付けるんですよね。 Public Sub AtaiHarituke2() Dim rg As Range 'セル Dim rw As Long '行カウンタ Dim Atai As String '先頭の値 Dim Atai2 As String '貼り付ける値 Set rg = Range("A1") '基準位置 With rg Atai = .Offset(rw, 0) While Atai <> "" 'なくなるまで続ける rw = rw + 1 Atai2 = .Offset(rw, 0) While Not (.Offset(rw + 1, 0) = "" And .Offset(rw + 2, 0) = "") rw = rw + 2 'ブロックの最終行でなければ次へ Wend .Offset(rw + 1, 0) = Atai2 '値を貼り付け rw = rw + 3 '次のブロック Atai = .Offset(rw, 0) Wend End With End Sub >また、データの持ち方が一行になく行列に持っていますので苦労しています。 チョッと意味を計りかねますが、一連のプロックが横に連なっている?意味ですか。この質問のデータの並びはそれを加工したものですか? 考え方によっては、データが文字列として整然と並んでいたほうが(あるパターンで)処理しやすいかもしれません。どのような形式でもデータの並びに規則性があればプログラム処理する上では問題ないと思います。

tsufu
質問者

補足

ありがとうございます。お中元をお送りしたい気分です。 ホストのデータを帳票として画面に出して、その画面を ベースにデータとして取り込んだものです。 <どのような形式でもデータの並びに規則性があればプログラム処理する上では問<題ないと思います。 そうなんでしょうね。 でも私レベルには大変です。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

質問の意味を理解していればいいのですが・・・・ 各ブロックの先頭の文字は2つを見る限り「abc」ですが、「abc」と一致したら貼り付ける意味でしょうか? 下記マクロは「abc」に限らず、ブロックの先頭文字を最終行に貼り付けます。 意味が違っていたら補足して下さい。 標準モジュールを追加して貼り付けます。 Public Sub AtaiHarituke() Dim rg As Range 'セル Dim rw As Long '行カウンタ Dim Atai As String '貼り付ける値 Set rg = Range("A1") '基準位置 With rg Atai = .Offset(rw, 0) While Atai <> "" 'なくなるまで続ける rw = rw + 1 While Not (.Offset(rw + 1, 0) = "" And .Offset(rw + 2, 0) = "") rw = rw + 2 'ブロックの最終行でなければ次へ Wend .Offset(rw + 1, 0) = Atai '値を貼り付け rw = rw + 3 '次のブロック Atai = .Offset(rw, 0) Wend End With End Sub

tsufu
質問者

お礼

いつも、ありがとうございます。 設定では先頭の文字のコピーにしましたが、 その一行下の場合はどうでしょうか? また、データの持ち方が一行になく行列に 持っていますので苦労しています。 また質問したときはよろしくお願い致します。

関連するQ&A

  • 【Excel2003】コピーするマクロ

    【Excel2003】コピーするマクロ Excelファイルで以下のようなデータがあります。   A       B 1 佐藤雄一 2 男 3 (空白行) 4 山本優子 5 女 6 (空白行) 7 ・・・ 8 ・・・ 9 (空白行) 上記のようなデータを下記のように変更したいです。 マクロ等を使用し、楽に修正するやり方を教えて下さい。 マクロを使用しなくても楽に修正する方法があればそれでも良いです。 分量が膨大なのでよろしくお願いします。   A       B 1 佐藤雄一  男 2 山本優子  女 3 ・・・     ・・・

  • 空白を埋めるマクロについて

    マクロで教えて下さい! A B C D    ...... 数量 名前 種類 購入者  .... 1  2  あ  A 2    く 3 5 DD 4          まま 5    さ 6          ぱぱ と右は何十項目・下は何千行と項目が続くデータがあります。 この空白に上の文字をコピーし埋めて行くマクロを作成するにはどうしたら良いでしょうか? ただし以下の条件があります。 (1)D列の様に1行目が空白のセルは4行目の様に文字が入っている所までは空白のまま (2)A列はそのファイルにより何行目までデータが入っているかは不明 A B C D     数量 名前 種類 購入者   1  2  あ  A       2  2  く A 3 5 く DD 4  5  く DD   まま 5  5  さ DD まま 6  5  さ DD   ぱぱ 宜しくお願い致します。

  • エクセルのマクロについての質問お願いいたします。

    エクセルのマクロについての質問お願いいたします。 コピーについてお願いいたします。 A列に文字(文章)が1行目から150行ぐらいや2000行ぐらいなど文字があります。この行の間には空白の行もあります。 Range("A1:A2000").Copyこちらですと最終行の以下の空白行もコピーするので困っております。 例えば、文字が1000行までで終わっていたら、1000行までコピーする方法をどうぞご教授ください。

  • エクセルでマクロの作成

    a列の1行目が『No』の項目名以下の行が空欄になっています。 b列に『あ』があれば同じ行のa列を空白にして、次のb行が空欄であれば同じ行のa列に1の数字を、b列の空白行に対しa列には連続番号が入るようにしたいのですが、マクロがどうしてもうまくできません。 どなたか、初心者向けに解りやすい解説と実際のマクロを教えていただけませんか? 初心者でうまく説明できてないかもしれませんがよろしくお願いします。

  • マクロで行を削除するには?

    Windows NTでExcel 2000を使っています。 あるデータベースがあって、ある条件で空白の行を3行挿入して区切りを入れ、 その2行目にデータの合計を出した表に対して行う作業なのですが この挿入した行を全て消して元の表に戻したいという場合には どうしたらよいのでしょうか。 私の思いつきですが、範囲指定した後に 「もしA1が空白の時にはその行全体を削除する。もしA2が…(以下同文)」 というマクロが書ければ可能なことだと思います。 ちなみに「データベースのコピーで合計作業をすれば」というのは こちらの都合上、無理と判断しているので これ以外でよい方法があれば教えてください。 よろしくお願いします。

  • エクセルのマクロ(行を挿入し連番を振る)

    ボタンを押すと以下のことを実行するマクロを作成することはできますか? A列2行目から 書類a 書類b 書類c 書類d 書類e C列2行目から 5 3 2 4 3 と入っています。C列は各書類の枚数です。 ボタンを押すと書類aと書類bの間に4行空白行が挿入され、A列とC列は増やした4行にそれぞれ書類a、5がコピーされ、B列には2列目から6列目まで1.2.3.4.5と連番が振られる。 というマクロです。 B列C列で1/5 2/5 3/5 4/5 5/5 であるという表現がしたいのです。(/は入りません) 書類が1枚の場合はB列C列共に空白で1/1とは入りません。 C列に入る書類の枚数により行が挿入されその書類の枚数分の連番が振られるようなマクロが作りたいです。 毎日何百行も手作業で挿入しコピーし連番を振る作業をしています。 決まった行数を増やすとか上の行をコピーするマクロならわかるのですが、C列の値を見て挿入する行数を判断するようなマクロができるのかわかりません。 どなたか教えて頂けないでしょうか。

  • ”アクティブセル行」の一行下を選択”するマクロ

    ■ ”アクティブセルの、1個下の行を選択し、新しい空白行を一行挿入” ■次にその”アクティブセルのA列とB列の値を、  新しく作った空白行に、コピー  ・・・といったマクロを組もうとしております。 たとえば 12行目を選択するプログラム(コマンド?マクロ?)は、  Rows(12:12) となっていたので、それにならって Rows(activecell:B) などとやってみたのですが、うまくいきませんでした。 このような場合、どうしたらよいのかアドバイスをいただけると助かります。 どうぞ、よろしくお願いいたします。  

  • マクロで、新しいシートを作りたい。

    エクセルのマクロを教えてください。 今は、Sheet1のA2に年月日、B2:H2にコード、項目1、項目2、・・・と入力します。 入力が終わったら、マクロを実行し、その後A2:H2をクリアしています。 今回やりたいのは、マクロの実行時に新しいシートを追加し、A2:H2をコピーしたいのです。 1 Sheet1のA2から、年月を取り出す。2003/1/1→200301 2 シートの中に、Sheet200301が有るかどうか調べ、無かったらSheet200301というシートを作る。 3 新しいシートを作ったら、Sheet4のA1:Z2をSheet200301に貼り付ける。 4 Sheet200301の最後の空白行を調べる。(新しいシートを作って最初は2行目になってもらいたい) 5 4で調べた空白行を次の行に貼り付ける。 6 4で調べた空白行にSheet1のA2:H2を貼り付ける。 7 Sheet1のA2:H2をクリアします。 よろしくお願いします。

  • エクセル【マクロ】について

    初心者です。 エクセルでシート1のA1からA10まで決めた文字(abc)という文字を検索して、検索文字があるセルの1行をコピーしてシート2のA1から下へ貼り付けるというマクロ(VBA)を作成したいと考えています。 詳しい方、よろしくお願いします。

  • エクセル マクロ 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行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

専門家に質問してみよう