• ベストアンサー

エクセルで入力済みのセルのみ見つけて・・

エクセルで入力済みのセルだけを見つけ出して、 指定した場所に並べる作業をマクロで1発で出来るようにしたいのですが、その方法を教えてください。 シートが37シートあります。(sheetA1~sheetA12,sheetB1~sheetB12,sheetC1~sheetC12,sheet37) それぞれセルC5からC20まで数値が入っていますが、 最終行はC20とは限りません。(sheet37はまとめるためのシートで空白) C15が最終行の場合もあれば、C18が最終行の場合もあります。 各シートそれぞれ最終行が違います。(列は同じですスタートもC5です) 各シートのC列の入力済みのセルの数値をsheet37のB1セルから順番に縦に並べたいのです。 A,B,Cのシート順にC列に入力された数値を縦に並べます。 空白は無しで詰めて並べます。 これを1回の作業でできるマクロを教えてください。 それから入力済みの最終行を見つけ出すマクロの部分を表示して頂けるとありがたいです。 宜しくお願いします。

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

  • ベストアンサー
  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.1

稚拙ですがこんな感じで Public Sub xxx()   Dim TargetSheet As Worksheet   Dim TargetCell As Range   Dim RowIndex As Long      RowIndex = 1      With ThisWorkbook      For Each TargetSheet In .Worksheets     If TargetSheet.Name <> "Sheet3" Then       For Each TargetCell In TargetSheet.Range("C5:C20")         If TargetCell <> "" Then           .Worksheets("Sheet3").Range("B" & RowIndex) = TargetCell.Value           RowIndex = RowIndex + 1         End If       Next     End If   Next      End With    End Sub 上記サンプルでは使用しませんでしたが、入力済みの最終入力行を検出する方法は幾つか存在し、入力されている内容によっても工夫が必要になります。 たとえばC21以降にデータが入力されていないのであれば Range("C21").End(XlUp) とする方法もあります。 他の手法に関してはネット上に色々とサンプルがありますので、一度検索してみてください。 http://www.google.co.jp/search?q=Excel+VBA%E3%80%80%E3%82%BB%E3%83%AB%E7%AF%84%E5%9B%B2%E3%80%80%E5%8F%96%E5%BE%97&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official

fightman11
質問者

補足

回答ありがとうございます。 うまく出来たのですが、ゼロ値のセルまで並べてしまいます。 私の勘違いで、空白だと思っていたセルはゼロが入っていました。 それを表示しない設定にしていただけでした。 ゼロ値のセルは無視するように出来ますか?

その他の回答 (3)

  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.4

hige_082氏からの忠告もありましたが、丸投げはいけませんよ。 提示したサンプルの内容や基本的なステートメントぐらいはヘルプなどで調べる癖をつけましょう。 でご質問の件ですが >  If TargetCell <> "" Then >    .Worksheets("Sheet3").Range("B" & RowIndex) = TargetCell.Value >    RowIndex = RowIndex + 1 >  End If 上記の部分で、検査対象のセルが空白でなければ、値をコピーするという内容になっていますので、IF文の条件を「空白でない かつ 0でない」と変更すればよいだけです。 つまり If TargetCell <> "" And TargetCell <> 0 Then と変更します。

fightman11
質問者

お礼

ありがとうございました。 お陰さまで解決しました。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

禁止事項、ネチケットは読みましたか? 禁止事項に、「丸投げ・依頼」という項目があります 良くお読みになってください 以上のことから最低限(sheetA1~sheetA12)、エラー処理なしです Sub test() Dim i, ii, iii As Integer iii = 1 For i = 1 To 12 For ii = 5 To Sheets("SheetA" & i).Range("c65536").End(xlUp).Row If Sheets("SheetA" & i).Range("c" & ii).Value <> "" Then Sheets("Sheet37").Range("b" & iii).Value = Sheets("SheetA" & i).Range("c" & ii).Value iii = iii + 1 End If Next ii Next i End Sub >それから入力済みの最終行を見つけ出すマクロの部分を表示して頂けるとありがたいです。 yahoo等で検索してみてください、いくらでもでてきます

fightman11
質問者

お礼

回答ありがとうございました。

  • Masa2072
  • ベストアンサー率51% (94/182)
回答No.2

先程の回答で > A,B,Cのシート順にC列に入力された数値を縦に並べます。 の部分を見落としていたので補足です。 先程のマクロでは、出力先シートを除いたワークシートを左から順に処理していきます。 シートがSheetA1~SheetA12,SheetB1~と順番に並んでいれば問題はありません。 もし順番どおりでなければ、ひと工夫必要になります。 出力先と同じ行にシート名も出力し、最終的にシート名で並び替えを行うというのはどうでしょうか? 仮にA列に出力する場合 .Worksheets("Sheet37").Range("B" & RowIndex) = TargetCell.Value の下に .Worksheets("Sheet37").Range("A" & RowIndex) = TargetSheet.Name を追加します。

関連するQ&A