- ベストアンサー
エクセル宜しくお願いします。
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 と貼り付けをしています。 それを関数を使い自動でする方法ありましたら 宜しくお願いします。
- みんなの回答 (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
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
結局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)
(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(時間)"の部分が不要のようですので、それに隣接するタブを含め、消去します。 という感じでいけそうでしょうか? 説明不足でないと良いのですが; 頑張ってください!!
お礼
何とかできました。。 ありがとうございました。。