• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.7

#5,#4のものです。#5のお礼部分について。 >セルG3000を選択しているのはなぜでしょうか。 済みません、下のほうのセルを適当に記入したもので、最下行G65536とすれば完全でしょう。 >sh2.Cells(j, "B").Value = sh1.Cells(i, "G")としましたがいいんですよね。 cells()やrange()を使う時、Valueの場合、省略できるので、省略しています。入れるのも明確になり良いでしょう。 >0を”0”にしたらうまくいきました もう一度やって見ましたが、0(数値)も飛ばしましたが。 ただ別のプログラムでやると0と’0の区別が思っているのと違うので、勉強してみます。

moooon
質問者

お礼

お礼が大変おそくなり申し訳ございません。 おかげさまで解決いたしました。 有難うございました。

その他の回答 (6)

noname#148473
noname#148473
回答No.6

#2です。 文字列が入る可能性があるということでしたら、IF文の行を以下のように変えてみてください。 うちではこれで問題なく動作しました。 If IsNumeric(Cells(xi, 7).Value) And Cells(xi, 7).Value <> 0 Then お手数ですが、不具合があれば、また補足くださいませ。

moooon
質問者

お礼

お礼が大変おそくなり申し訳ございません。 おかげさまで解決いたしました。 有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#3です。OKWEBからコピーして、私がやると上手く走ります。 テストデータ(G列) (無し)   (G2セル) 0 asd 大阪 京都 0 (無し) (1ブランク) fan AERTY    (G11セル) でやって見て、エラーになりません。Sheet2に asd   B2セル 大阪 京都 fan AERTY  B7セル とセットされました。

moooon
質問者

お礼

なぜかわかりませんが、0を”0”にしたらうまくいきました!どうしてでしょう? 良く理屈がわかりません。 sheet1から持ってきたいのは式ではなく値ですので、 sh2.Cells(j, "B").Value = sh1.Cells(i, "G")としましたがいいんですよね? ところでセルG3000を選択しているのはなぜでしょうか? 標準モジュールにペーストしたマクロをそのままコピーしました。 ↓ Sub test02() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") j = 2 sh1.Activate sh1.Range("G3000").Select d = Selection.End(xlUp).Row For i = 1 To d If (sh1.Cells(i, "G") <> "0") And (sh1.Cells(i, "G") <> "") Then sh2.Cells(j, "B").Value = sh1.Cells(i, "G") j = j + 1 End If Next i End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>sheet2にもってくるのはG列だけではありません。その表の他の列の部分も持ってきたいのです。 これは簡単。h列をc列に持ってくるなら sh2.Cells(j, "C") =sh1.Cells(i, "H") 同じような行をいくつも並べれば良い。右辺のSh1.は安全のため今回付け加えました。 >エラーが出た 私のテストでは上手く行きました。 >G列にはいるのは数値だけではありませんでした。文字列も一部あったのです。 G列に入っているデータは(1)DELキーを押した状態 すなわち""、数値の0、その外どんなデータが入っていますか。 >If (sh1.Cells(i, "G") <> 0) And (sh1.Cells(i, "G") <> "") Then ここは、OKWEBの強制改行で2行になっているが、1行にして(下の行を、上の行の右にくっ付けて) 実行してくださっているでしょうか。

moooon
質問者

補足

さっそくありがとうございます。 > sh2.Cells(j, "C") =sh1.Cells(i, "H") > 同じような行をいくつも並べれば良い。右辺のSh1.は安全のため今回付け加えました。 その通りですね。了解しました。 >If (sh1.Cells(i, "G") <> 0) And (sh1.Cells(i, "G") <> "") Then 上記は1行です。 G列のデータは直接数値やABC等の文字列を入力したもの、あるいは他のセルの値を =sheet3!B5 のような式で参照したものです。 どうも文字列のところでひっかかってしまうようです。文字列より上の数値はSheet2に転記され、文字列で止っています。(文字列は転記されない) よろしくお願いします。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

コピーというより、代入で出来ます。 Sub test02() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") j = 2 sh1.Activate sh1.Range("G3000").Select d = Selection.End(xlUp).Row For i = 1 To d If (sh1.Cells(i, "G") <> 0) And (sh1.Cells(i, "G") <> "") Then sh2.Cells(j, "B") = Cells(i, "G") j = j + 1 End If Next i End Sub (少数例でテスト済み)

moooon
質問者

お礼

さっそくありがとうございます。 下でも書きましたが、G列にはいるのは数値だけではありませんでした。文字列も一部あったのです。 その為だと思いますが、 If (sh1.Cells(i, "G") <> 0) And (sh1.Cells(i, "G") <> "") Then の部分で実行時エラー13「型が一致しません」となってしまいました。 また、sheet2にもってくるのはG列だけではありません。その表の他の列の部分も持ってきたいのです。 どう手直しすればいいでしょうか?

noname#148473
noname#148473
回答No.2

#1の方が書かれたように、データ範囲が常にE3:J29なのかどうかで違ってくるのですが、とりあえず固定なのだと仮定しますと、以下のようになります。 '----------------------------------- Sub データコピー() Dim xi As Integer Dim xj As Integer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") xj = 2 For xi = 3 To 29 If Cells(xi, 7).Value > 0 Or Cells(xi, 7).Value < 0 Then With WS2 .Cells(xj, 2).Value = WS1.Cells(xi, 5).Value .Cells(xj, 3).Value = WS1.Cells(xi, 6).Value .Cells(xj, 4).Value = WS1.Cells(xi, 7).Value .Cells(xj, 5).Value = WS1.Cells(xi, 8).Value .Cells(xj, 6).Value = WS1.Cells(xi, 9).Value .Cells(xj, 7).Value = WS1.Cells(xi, 10).Value End With xj = xj + 1 End If Next End Sub '----------------------------------- もしデータ数が可変なのでしたら、補足してください。

moooon
質問者

お礼

さっそくありがとうございます。 If Cells(xi, 7).Value > 0 Or Cells(xi, 7).Value < 0 Then の部分で実行時エラー13「型が一致しません」となってしまいました。 わたしの説明の書き方がまずかったです。 G列にはいるのは数値だけではありませんでした。文字列も一部あったのです。 その為だと思います。 どう手直しすればいいでしょうか?

noname#181872
noname#181872
回答No.1

もとの表はE3:J29で固定ですか? もしそうであれば、forループで3から29までまわして、 if IsEmpty(Cells(i, 7).Value) = false and Cells(i, 7).Value <> 0 という形で通る行だけコピーペストしたらいいのではないでしょうか? それかまるごとコピーして、上と似たような形で…=true or …=0のとき その行を削除する、というのではいかがでしょうか?

moooon
質問者

お礼

ありがとうございます。 その書き方がわからないのです。すみません。

関連するQ&A