• ベストアンサー

エクセル2000で質問です。

例のようにシート1のC列に数字が入った場合のみ、その行のすべてを シート2にコピーさせたいのですがどうすればよいのでしょうか? シート1       A        B       C      4   10/20     東京     200         5   10/21     大阪 6    10/21    名古屋     400 7   10/21     東京      600 8   10/22     福岡 9   10/22     東京      900 10   10/23     大阪 11  10/23     名古屋      700 シート2      A        B        C      4   10/20     東京       200         5   10/21     名古屋       400 6   10/21     東京        600 7    10/22    東京       900 8    10/23     名古屋       700

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

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

#6の32cooperさんへ 私は、ここでは、マクロの回答が主なのですが、どこそこの掲示板の善し悪しではなくて、そこにいる人の問題だと思います。質問者にとって、たまたま、めぐり合った回答者との相性やその回答者の熱心さや態度によって、その掲示板の印象が決まってくるような気がします。回答者は大勢いても、本当に回答がヒットする人は、どこの掲示板でも1人か2人です。 choroqさんへ 一応、マクロの話も出ていたので、私のほうから掲示させていただくことにしました。以下のコードは、数式を入れるユーザー定義関数です。だから、範囲さえ決まっていれば、入力に対して自動的に反応します。choroqさんが、それを望んでいるかは別問題ですが、意図している内容に一番近いものとしては、このようなスタイルになることを書いたまでです。しかし、関数としての選択肢がある場合、マクロを望んでいないのに、VBAのコードを提供するのは、私は、必ずしも、マナーとしては良くないような気がしています。前もってお詫びさせていただきます。 '-------------------------------------------------------------- 'コードの取り付け方: 'Alt +  F11 (Altを押しながらF11)を押すと、Visual Basic Editor 画面が出てきます。 '次に、メニューの[挿入]-[標準モジュール]と開けて、クリックすると、画面が現れますので、以下のコードを貼り付けて、 'Alt + Q で、画面を閉じます。 '------------------------------------------------------------- '標準モジュール Function MYINDEX(全範囲 As Range, 検索セル As Range, 表示行 As Integer, 表示列 As Integer) As Variant Dim rngTotal As Range Dim rngIndex As Range Dim intRow As Integer Dim intCol As Integer Dim i As Integer Dim strFormat As String Dim buf() As Variant If 表示列 = 0 Or 表示列 > 全範囲.Columns.Count Then MYINDEX = "": Exit Function Set rngTotal = 全範囲 Set rngIndex = 検索セル intRow = 表示行 intCol = 表示列 If Intersect(rngTotal, rngIndex) Is Nothing Then Exit Function For i = 1 To rngTotal.Rows.Count  If Not IsEmpty(rngTotal.Cells(i, rngIndex.Column - rngTotal.Cells(1).Column + 1)) Then    ReDim Preserve buf(j)    buf(j) = rngTotal.Cells(i, intCol).Value    j = j + 1  End If Next i If UBound(buf()) + 1 >= intRow Then  MYINDEX = buf(intRow - 1) Else   MYINDEX = "" End If Set rngTotal = Nothing Set rngIndex = Nothing End Function //このユーザー定義関数の使い方// Sheet2 A4 =MYINDEX(Sheet1!$A$4:$G$100,Sheet1!$G$4,ROW($A1),1) ※日付の書式は、メニューから、書式-セルで直すか、書式コピーをしてください。 解説: =MYINDEX(全体の範囲,検索のセル,行の連番,表示させる列) ただ、計算表示は一般関数よりも、10倍ぐらい遅いはずです。(5msぐらいか?)[=5/1000秒]

choroq
質問者

お礼

御礼が遅くなり申し訳ありませんでした。 お陰で上手くいきました。 マクロについては使った事はないですが、組んだものを使用した事が あります。 今回の場合どちらを使うのが懸命なのかは素人の私には判断出来ません。 ただ式なら分からないなりにも何となく理解できます。 マクロとなると勉強不足の私にはチンプンカンプンなところがあります。 こうやっていろんな事をやりだすとエクセルって本当に奥の深いソフトなんだと 改めて痛感します。 Wendy02さんのレベルには到底追いつかないですが少しでも理解してここで みなさまの指示を仰がなくても出来るように私なりにチャレンジして行きたいと思います。 また質問でお世話になる事があると思いますがその節は宜しくお願い致します。 いろいろと有難うございました。

その他の回答 (6)

  • 32cooper
  • ベストアンサー率23% (9/38)
回答No.6

No1の回答者です。 コピーが面倒くさいというのなら、複雑な式を使うよりも マクロを組んだほうが遥かに簡単ですよ。 選択コピー貼り付けもワンクリックです。 EXCELの詳しい質問はEXCELファンクラブがお勧めです。

参考URL:
http://www.fuji.ne.jp/~excelyou/index.htm
choroq
質問者

お礼

御礼が遅くなり申し訳ありませんでした。 大変参考になりました。 有難うございました。

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

こんにちは。Wendy02です。 着目する点は、以下の4つですね。 そのまま、右にドラッグしても無理なのは言うまでもないのですが、C列に対して、数字があるかどうかを取っていますから、当然、C→Gに直してあげれば、表としては完成するはずです。 ただし、私の書いたものには、2つほど間違いがありますね。 IF(COUNT(Sheet1!$C$1:$C$101)←間違い 正→IF(COUNT(Sheet1!$C$4:$C$104) INDEX(Sheet1!$A$4:$C$104 ISNUMBER(Sheet1!$C$4:$C$104) COUNT(Sheet1!$C$1:$C$101)←間違い 正→COUNT(Sheet1!$C$4:$C$1014 A4(右に必要なだけドラッグ) =IF(COUNT(Sheet1!$G$4:$G$104)>=ROW(A1),INDEX(Sheet1!$A$4:$G$104,SMALL(INDEX(ISNUMBER(Sheet1!$G$4:$G$104)*ROW($A$1:$A$101),,),ROWS($A$1:$A$101)-COUNT(Sheet1!$G$4:$G$104)+ROW(A1)),COLUMN(A1)),"") (Sheet1のG4に対するデータ) =IF(COUNT(Sheet1!$G$4:$G$104)>=ROW(C1),INDEX(Sheet1!$A$4:$G$104,SMALL(INDEX(ISNUMBER(Sheet1!$G$4:$G$104)*ROW($A$1:$A$101),,),ROWS($A$1:$A$101)-COUNT(Sheet1!$G$4:$G$104)+ROW(C1)),COLUMN(G1)),"") ※作り方は、右にドラッグして、例えば、C列だったら、数式の最後のCOLUMN(C1)になっていますから、そこを、G1 に換えます。 後は、下にドラック・コピーすればよいです。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.4

◆Sheet2のA4 A4=IF(ROW(A1)>COUNT(Sheet1!$C$4:$C$20),"",INDEX(Sheet1!A$1:A$20,SMALL(INDEX(SUBSTITUTE((Sheet1!$C$4:$C$20<>"")*1,0,10^5)*ROW(Sheet1!$C$4:$C$20),),ROW(A1)))) ★Enterで式を確定させて、右と下にコピー

choroq
質問者

お礼

御礼が遅くなり申し訳ありませんでした。 大変参考になりました。 有難うございました。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

次の方法は如何でしょうか。 シート2のA1に次の数式を設定して、縦横にコピーして下さい。 数式は配列を使用していますので、入力完了時にshift+ctrl+enterを同時押下して下さい。 又、数字列は数式コピー後、表示形式を標準にして下さい。 =IF(ROW(A1)<=COUNTIF(Sheet1!$C:$C,">0"),INDEX(Sheet1!A:A,SMALL(IF(ISNUMBER(Sheet1!$C$4:$C$1000),ROW(Sheet1!$C$4:$C$1000),65536),ROW(A1))),"")

choroq
質問者

お礼

有難うございました。 大変参考になりました。

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

こんばんは。Wendy02です。 前の式の延長です。 A4 ~右へ2つ-下に必要なだけ =IF(COUNT(Sheet1!$C$1:$C$101)>=ROW(A1),INDEX(Sheet1!$A$4:$C$104,SMALL(INDEX(ISNUMBER(Sheet1!$C$4:$C$104)*ROW($A$1:$A$101),,),ROWS($A$1:$A$101)-COUNT(Sheet1!$C$1:$C$101)+ROW(A1)),COLUMN(A1)),"")

choroq
質問者

お礼

Wendy02さん いつも有難うございます。 上手くいまきました。 出来れば追加で教えて下さい。 C列に数値が入ったらという条件はそのままにG列まで文字なり数値なりが 入っていた場合、シート2にG列までをそのままコピーさせたい場合は どうすればよいのでしょう? 教えて頂いた式をドラッグしてもエラーがでますよね。 私なりにいろいろと試したのですがどうしても上手くいきません。 お手数ですが宜しくお願いします。

  • 32cooper
  • ベストアンサー率23% (9/38)
回答No.1

簡単な方法としては、シート1でデータ>フィルターオートフィルタというのをかけて、Cの項目で空白以外のセルという指定をします。 そうすると、数字の入った行だけが抽出されるので、それを範囲指定してコピーして、シート2に貼り付けると可能です。

choroq
質問者

お礼

早々に有難うございます。 その方法なら私も知っていますがそういう事をいちいちやりたくないので 式を入れたいと考えました。 アドバイス有難うございました。

関連するQ&A