• ベストアンサー

エクセル宜しくお願いします。

A列はコードナンバー、B列には氏名 1行目は日付2列目は曜日3列目からは来店された時間 1時間未満なら1、3時間未満なら3と・・・(手入力)    日付 7/1 7/2 7/3 7/4    曜日  木   金   土   日 1 Aさん  1   2   1   1 2 Bさん  0   3   1   4 3 Cさん  2   0   2   3 4 Dさん  1   1   1   0 200番まであります それを現状はオートフィルタをつかい0を省いて1から順にコピー貼り付けをしています。別シート    日付 7/1     曜日  木  1 Aさん  1 4 Dさん  1 3 Cさん  2 と貼り付けをしています。 それを関数を使い自動でする方法ありましたら 宜しくお願いします。

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

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

#2です。#2では0を見る列だけしか取れません。それで Function nzero(a, n, o) Dim cl As Range m = 0 For Each cl In a If cl = 0 Then Else m = m + 1 If m = n Then nzero = cl.Offset(0, o) Exit Function End If End If Next End Function に改めます。 Sheet2のA1には =nzero(Sheet1!$B$1:$B$10,ROW(),-1)といれて下へ複写 B1には =nzero(Sheet1!$B$1:$B$10,ROW(),0)といれて下へ複写してください。 (テストデータ) Sheet1のA1:B7 a 1 b 0 c 2 d 0 r 0 f 3 g 1 (結果) Sheet2のA1:B4に a 1 c 2 f 3 g 1

bartenn
質問者

お礼

何とかできました。。 ありがとうございました。。

その他の回答 (2)

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

結局0の行を省いて、詰めて、別シートにコピー出来れば良いのでしょう。 VBEの標準モジュールにユーザー関数nzero(名前は何でも、既存の関数名でなければ良い)を定義し Function nzero(a, n) Dim cl As Range m = 0 For Each cl In a If cl = 0 Then Else m = m + 1 If m = n Then nzero = cl Exit Function End If End If Next End Function を定義し Sheet2のA1に =nzero(Sheet1!$A$1:$A$10,ROW(A1)) といれ、下方向に式を複写します。 $A$10は最下行を指定してください。 なおSheet2の書式を、ユーザー定義の「#」にして 、下の方に現れる0は空白表示にします。 (例データ)Sheet1のA1:A10に 12 2 0 0 2 3 0 1 0 21 (結果)Sheet2のA列 12 2 2 3 1 21

  • R-G
  • ベストアンサー率46% (12/26)
回答No.1

(1)    日付 7/1    曜日  木 1 Aさん  1 2 Bさん  0 3 Cさん  2 4 Dさん  1・・・ を選択(欲しい範囲をドラッグ)し、右クリックしてコピー→別シートに貼り付けします。 (2) 新しいシートの 1 Aさん  1 2 Bさん  0 3 Cさん  2 4 Dさん  1・・・ をドラッグ(選択)して、"データ"の"並べ替え"をクリックします。 (3)"最優先されるキー"に曜日部分である"2列目"を選んで"昇順"にし、"範囲の先頭行"を"データ"にして"OK"します。 (4)曜日の"0(時間)"の部分が不要のようですので、それに隣接するタブを含め、消去します。 という感じでいけそうでしょうか? 説明不足でないと良いのですが; 頑張ってください!!

関連するQ&A