• ベストアンサー

excel2000でVBAのコード相談

添付図にあるように、 A列 日付 B列 時刻 C列 値 という表があります。 そして、画像のように 値が3以上の時の、日付と時刻を、F列~J列の表に書き出したいです。 書き出す表は、上から順に 1回目が9行目、2回目が10行目、3回目が11行目 ・・・ といった具合です。 どういったコードがいいか、なかなか思い浮かばず、いいものを教えていただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

まぁ一行ずつ舐め回していって書き出してもさほどの手間ではないと思いますが,ざっとこんなカンジでも。 sub macro1()  dim n as long  dim Target as range  dim ha as range  dim h1 as range, h2 as range ’条件調査  if application.countif(range("C:C"), ">2") = 0 then exit sub  range("F9:G65536,I9:J65536").clearcontents ’初期化  range("A1:C" & range("A65536").end(xlup).row).autofilter field:=3, criteria1:=">=3"  set target = range("A2:C" & range("A65536").end(xlup).row)  n = 8 ’カタマリごとにコピー  for each ha in target.specialcells(xlcelltypevisible).areas   set h1 = ha.cells(1).resize(1, 2)   set h2 = ha.cells(ha.count).offset(0, -2).resize(1, 2)   n = n + 1   h1.copy destination:=cells(n, "F")   h2.copy destination:=cells(n, "I")  next  activesheet.autofiltermode = false end sub #作業列を丁寧に使って関数だけで仕上げる事もできそうですが,マクロの方が手っ取り早いです。

puyopa
質問者

お礼

ご返事、遅れて申し訳ございません。回答、ありがとうございました。 keithin様のコードは、とにかく無駄がなく、シンプル。で理想的だと思います。 私が自分で作ろうとすると、無駄に長くなりすぎて、処理スピードも遅いものが出来てしまいます。 そして、コードをご提示いただいて、あぁなるほど。となんとか理解出来たときの喜びを感じることができます。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

VBAは自動記録+α程度の知識しかないので 数式でやってみました D1セル 0 D2セル =AND(C2>=3,C1<3)+AND(C2<3,C1>=3)+D1 下へオートフィル 最下行が3以上 かつ 終わり の可能性があるなら 最下行+1行までオートフィルします E9セル 下へ連番 書式 - 表示形式 - ユーザー定義 第0回目 F9セル =IF(MAX($D:$D)<$E9*2,"",INDEX(A:A,MATCH($E9*2-1,$D:$D)+1)) 右へ下へオートフィル I9セル =IF(MAX($D:$D)<$E9*2+1,"",INDEX(A:A,MATCH($E9*2,$D:$D))) 右へ下へオートフィル

puyopa
質問者

お礼

ご返事遅くなり、申し訳ございません。回答ありがとうございました。 関数だけを駆使して、やり遂げる回答者様の柔軟さには、感服いたしました。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

何が聞きたいのか明確にして質問のこと。 図だけでは、はっきりわからない。 処理を1歩一歩文章に箇条書きしてみること。 >値が3以上の時の、 これは色々なやり方があるが、全行について値が3以上かどうか、判別して、以上だったら処理をすれば良い。 For i= 1 to d 処理 Next i で仕舞いだろう。dはデータ最終行の行番号 ーー しかし処理が文章で、明確に文章になっていない。 各3以上の塊の「連(つらなり)」の最初と最後を左右の列に書き出すのが主旨だろう。 ーー ロジックはどう考えたのか。 >相談 、といっても丸投げではないか。何処までやってみた?特にロジックは、色々なやり方が考えられるが、考えてみたか?ここが初心者には訓練がされておらず、出にくいようだ。 ーー 一例(といっても、「コントロールの処理」という基本的な処理パターンだ) (1)3以上のものが現れたら、まず左側の箱に書き出す。そのとき書き出す行のために行ポインタを+1して前回分の下にずらす。   右の箱にも書き出る(最終決定ではないが、とりあえず)。連のサインをON。 (2)次の行を読んで3以上なら、(連(つらなり)の中の場合)右の箱(終わり・エンド)だけを書き直し。 (3)3以下なら、何もしない。ただしここで連は途切れたので、連のサインをOFF。 (4)最終行が来たら終わり ーー コード Sub test01() d = Range("A65536").End(xlUp).Row 'MsgBox d j = 8 '右の箱の最初行の手前行 ren = "n" '続きの中か For i = 2 To d 'データは2行目から If Cells(i, "C") >= 3 Then If ren = "n" Then '連なりの途中(連の最初)でないなら '--左の箱 j = j + 1 Cells(j, "F") = Cells(i, "A") Cells(j, "G") = Cells(i, "B") '--右の箱 Cells(j, "I") = Cells(i, "A") Cells(j, "J") = Cells(i, "B") ren = "y" Else '--連なりの途中(連の最初)なら、右の箱  だけ上書き(jは変えてないことに留意) Cells(j, "I") = Cells(i, "A") Cells(j, "J") = Cells(i, "B") End If Else ren = "n" End If Next i End Sub ーー 余り沢山のデータでテストしていないので、可笑しなケースがあればご免。 例データ 時刻は省略 A1:C13 日付 時刻 値 2011/4/1 3 2011/4/2 4 2011/4/3 6 2011/4/4 1 2011/4/5 1 2011/4/6 3 2011/4/7 6 2011/4/8 2 2011/4/9 2 2011/4/10 4 2011/4/11 2 2011/4/12 7 ーー 結果 F9:I12 2011/4/1 2011/4/3 2011/4/6 2011/4/7 2011/4/10 2011/4/10 2011/4/12 2011/4/12

puyopa
質問者

お礼

ご返事おそくなり、申し訳ございません。 本件、自分で作成しようと、途中で挫折してしまったのですが、 質問の仕方として、全容が分かる形のものがいいかと思い。 と考えてしまいました。 以後、質問の仕方を気をつけます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【EXCEL VBA】データの並べ替えの方法

    元データが左から右へ氏名コード、日付(2011/5/1)、出社時刻、退社時刻、日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻、と順に1ヶ月分入力されています。(画像上) このデータを一番左端に氏名コード、上から日付(2011/5/1)、出社時刻、退社時刻、行を変えて日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻。(画像下)と言う形に行・列の並べ替えをしたいと考えています。 EXCELの機能である、「コピー→編集→形式を選択して貼り付け→行列を入れ替える」では対応できず、VBAマクロ又は関数で試みようとしましたが、こちらも対応方法が見つかりません。 何かいい方法がございましたら、ご指導のほど宜しくお願い致します。 尚、作業環境はWindows7、MS office2010です。 

  • Excel2003VBA 行の非表示

    お世話になります。 掲題の件で ご相談が御座います。 ある特定の列(連続した4列F、G、H、Iです)が全部「0」だった場合 その行 全体を非表示にするというマクロを組みたいのですが 未熟者の為 どのようなコードを記述したら良いのか分からず困っております。 どなたかご教示いただけませんでしょうか。 F、I列は数式により「0」と表示されています。 G、H列は値で「0」になっております。 表全体は600行ぐらいまでですが、今後増える可能性があります。 (増えても800行までは行かないと思います) 説明不足等が御座いましたら ご指摘ください。 宜しくお願い致します。

  • 【EXCEL VBA】COUNTIF関数について

    A列・B列:氏名コード、C列:日付、D列:出社時刻、E列:退社時刻、F列:勤務時間といった具合に1ヶ月分のデータが入力されています。 各々氏名コード毎にG列の月末日の箇所に1ヶ月分の勤務時間の合計を入れているのですが、出社時刻と退社時刻がブランク(休日等)の場合、F列の勤務時間が0時間でなく24:00:00で換算されてしまう為、実質1ヶ月分の勤務時間の合計がその分加算されてしまいます。(画像参照) そこで、各々氏名コード毎にH列の月末日の箇所に24:00:00で換算されてオーバーしてしまった時間を自動的にカウント出来るようにしたいのです。 手動で勤務時間の1ヶ月の合計を算出する場合は、 [=IF(A32<>A33,SUMIF(A:A,A32,F:F),"")]で、 また手動で24:00:00で換算されてオーバーしてしまった時間をカウントする場合は、 [=COUNTIF(F2:F32,"24:00:00")] と関数対応できるところまではこじつけたたのですが、マクロで自動的に反映させる方法が分かりません。 何かいい手順がございましたら、ご指導の程宜しくお願い致します。 尚、作業環境はWindows7、office2010です。

  • エクセル VBAコードの書き方を教えてください。

    エクセル VBAコードの書き方を教えてください。 今回は、VBAで掛け算をしたいのですが、 コードが間違っているためか実行ができません。 VBAコードのどこに不備があるか教えてください。 <条件> *最終行(H列で判断)を選択し、  I2(2行、I列)~I最終行(最終行,最終行のI列)までの  範囲を計算したい。 *たとえば、I2であれば、F2×G2×H2×0.01の値を代入したい。  I最終行であれば、F最終行×G最終行×H最終行×0.01の値 EX) 添付ファイルの場合、I2=500、I4=125、にしたい。 <参考> Sub SURYO() Dim r As Long With Sheets("Sheet1") For r = 2 Cells(r,9).value = Cells(r,6) * Cells(r,7) * Cells(r,8) Next End With End Sub よろしくお願いします。

  • 【Excel VBA】コードの書き方「AまたはBではなかったら…」

    Excel2003を使用しています。 マクロで、「選択した範囲で、A列-C列、または、F列-H列が0じゃなかったら、その行をコピーする」という処理をしたいのですが、どのようにコードを書いたらいいでしょうか? 当初は、「A列-C列が0じゃなかったら…」と条件がひとつだけで、そのときは、下記のコード(一部記載)で問題なく処理できていたのですが、条件をもうひとつ追加したら、エラーは出ないものの、結果が反映されなくなってしまいました。 マクロ勉強中ですので、ここはこんなふうにと指摘していただけると助かります。よろしくお願いします。 「A列-C列が0じゃなかったら…」   With Sheets("Sheet1")    For m = i To k    If .Cells(m, 1) - .Cells(m, 3) <> 0 Then    .Range(.Cells(m, j), .Cells(m, l)).Copy      ↓ 「A列-C列、または、F列-H列が0じゃなかったら…」    If( .Cells(m, 1) - .Cells(m, 3) <> 0 Or .Cells(m, 6) - .Cells(m, 8) <> 0) Then ( i, j, k, l で、それぞれ、選択範囲の1行目、1列目、最終行、最終列を取得しています。)

  • VBAのコードに関する質問です。

    B列の値が3の時に対応するJ列の値を選択し、そのJ列の値の平均値をI2に出力する、というVBAのコードを教えてほしいです。

  • Excel2003でのVBA

    WindowsXPでExcel2003を使っています。 Excelにある表をマクロを使って編集したいと思ったのですが、セルの選択の設定で教えてほしい事があります。 まず、横A列~F列、縦1行~6行までの表があります。 A1セルは、空白。 B1セル~F1セルには、1~5の数字が入っています。(見出しなので全て入ってます。) A2セル~A6セルには、a~eのアルファベットが入っています。(見出しなので全て入ってます。) 表の中のデータは、ところどころにしか入っていなくて、全て埋まっていません。 また、横A列~F列というのは固定なのですが、縦1行~6行までという行数は変動します。 この表で、A2セルからF6セルまでを選択したいのですが、行が変動するのでA6とかF6とかでは指定できません。 Range("A2").Select Selection.End(xlDown).Select これで、A2セル~一番下の行(ここではA6セル)まで選択した後、F列まで(列の数は固定です。)選択するにはどうしたらよいのでしょうか? 右下のセルは、空白なので困っています。 Range(Selection, Selection.Next).Select こんなものを考えましたが、これでは一つ右隣しか選択できません。 これを少しいじればいいのではないかと思うのですが、全然違う方法でもかまいません。 どなたか教えていただけないでしょうか? 宜しくお願いします。

  • VBAのコードについての質問

    いつもお世話になっております。 以下の操作(添付ファイル)に対するVBAのコードを教えてください。 (1)シート1(添付ファイル左):B列に新聞名、C列に対象記事数 (2)マクロを実行することにより、シート2(添付ファイル左)の表が作成される。 質問したい事は、A新聞の記事数が3、B新聞の記事数が2なので、シート2にA新聞の行が3行作成され、その下に、B新聞の行が2行・・・・記事数が0の場合は行は作成されない。 のような事をやいりたいのですが、コードが分かりません。 どなたかよろしくご教授ください。

  • EXCEL VBAの重複行削除について

    EXCEL2010を使用しています。 添付画像の「重複行削除 前」の表を、RemoveDuplicatesで下の様にコードを組んで A列で重複する行を見て重複する行を削除しています。 Public Sub 重複行削除()  With WorkSheets(1)   .Range(.Cells(1, 1), .Cells(8, 3)).RemoveDuplicates _      Columns:=1, Header:=xlYes  End With End Sub すると、日付の新しいデータが削除され、古いデータが残ってしまいます。 (添付画像の「重複行削除 後」) ReniveDuplicates Columns:=Array(1,3) とした場合は、すべてのデータが残ってしまいます。 添付画像の「欲しいデータ」の表の様に、 日付の新しいものを残すように重複行削除は出来ないでしょうか? 詳しい方、どうか教えてください。 よろしくお願いします。

  • エクセルVBAのコードの書き方を教えてください

    エクセルVBAの初心者です。 下記①-⑲のようなコードを書きたいのですが、どなたかお分かりになる方がいましたら、 ご教示いただけますと幸いです。 ① オートフィルターでシート[list]のA列に"●"がある特定の行だけを以下作業の対象にしたい ② ①で特定した行のE列セルの値を、シート[output]のB9セルにコピペする ③ ①で特定した行のF列セルの値を、シート[output]のB12セルにコピペする ④ ①で特定した行のG列セルの値を、シート[output]のB15セルにコピペする ⑤ ①で特定した行のH列セルの値を、シート[output]のB18セルにコピペする ⑥ ①で特定した行のI列セルの値を、シート[output]のB21セルにコピペする ⑦ ①で特定した行のJ列セルの値を、シート[output]のB24セルにコピペする ⑧ ①で特定した行のK列セルの値を、シート[output]のB27セルにコピペする ⑨ ①で特定した行のL列セルの値を、シート[output]のB30セルにコピペする ⑩ ①で特定した行のM列セルの値を、シート[output]のB33セルにコピペする ⑪ ①で特定した行のN列セルの値を、シート[output]のB36セルにコピペする ⑫ ①で特定した行のO列セルの値を、シート[output]のB39セルにコピペする ⑬ ①で特定した行のP列セルの値を、シート[output]のB42セルにコピペする ⑭ ①で特定した行のQ列セルの値を、シート[output]のB45セルにコピペする ⑮ ①で特定した行のR列セルの値を、シート[output]のB48セルにコピペする ⑯ ①で特定した行のS列セルの値を、シート[output]のB51セルにコピペする ⑰ ①で特定した行のT列セルの値を、シート[output]のB54セルにコピペする ⑱ ①で特定した行のU列セルの値を、シート[output]のB57セルにコピペする ⑲ シート[output]のB3:B59をテキストファイルを呼び出してコピペする ※このとき、上記②-⑱で記述したB9からB57のセルには改行が含まれる場合が  あるため、テキストファイルへのペースト時に""が表示されてしまうが、  もし可能であれば、この""が表示されないようにしたい。

専門家に質問してみよう