質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

エクセル VBA シフト表作成中

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,292

Dai-2016

score 20

当日の出勤者のみ表示したいと考えています。

以下の図のようなシフト表を作成しています。
イメージ説明

2枚目の図は、私が理想とするイメージ図です。
●出勤者のみ、詰めて表示される。
●出勤者の出勤、退勤、休憩も同時に表示される
イメージ説明

今までは、関数で出勤者を抽出していました。
そのため、作業シートを2枚使用しています。

作業シートを使用せずにVBAで出来るようになれば理想通りです。
皆様の知恵をお借りしたいと考えています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/05/25 16:07

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

checkベストアンサー

0

基本的な部分のみVBAで書いてみました。

Dim src_ws As Worksheet
Dim dst_ws As Worksheet
Dim src_row As Long
Dim dst_row As Long
Dim dd As Long

Set src_ws = Worksheets("Sheet1")
Set dst_ws = Worksheets("Sheet2")

src_row = 2
dst_row = 3
dd = 1
Do
    ' 名前がなければ終了
    If src_ws.Cells(src_row, 1) = "" Then Exit Do

    ' 出勤が登録されているか
    If src_ws.Cells(src_row + 1, dd + 2) <> "" Then
        dst_ws.Cells(dst_row, 1) = src_ws.Cells(src_row, 1)                 ' 名前
        src_ws.Cells(src_row + 1, dd + 2).Copy dst_ws.Cells(dst_row, 2)     ' 出勤
        src_ws.Cells(src_row + 2, dd + 2).Copy dst_ws.Cells(dst_row, 3)     ' 退勤
        src_ws.Cells(src_row + 3, dd + 2).Copy dst_ws.Cells(dst_row, 4)     ' 休憩
        dst_row = dst_row + 1
    End If
    src_row = src_row + 4
Loop

このコードでは変数ddの値を対象の日付に見立てています。
dd = 2 にすれば、2日が対象になります。
これをベースに関数化したり、装飾を加えたりすれば、それなりになるかなと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 15:41

    jawaさん
    元々そうしてたんですが、時刻なので書式設定をするのが面倒で、コピーしています。
    ここらへんは質問者さんが独自にカスタマイズいただければと思ってます。
    Dai-2016さんがエラーになっているのは、おそらく期待するフォーマットで縦3列を結合した状態の枠を作って、その上で実行しているからではないかと推測してます。
    提示したコードはあくまでもサンプルなので、そこまでは考えていなくて、1行1名で出力しています。

    キャンセル

  • 2016/05/25 16:01

    ttyp03さん
    なるほど、そういうことでしたか。失礼しました。

    コピー先がセル結合されているということは、既にコピー先にある程度の書式設定がされているのかもしれませんね。
    それなら(コピー先の時刻セルには時刻形式の書式設定をしておいて)値渡しでいいのかも。

    コピーしたうえでセル結合や書式設定をするなら相応の肉付けが必要になりますが、どちらにしても質問者さんが都合のいいようにカスタマイズ、ということですね。

    Dai-2016さん、必要な情報はだいたい揃っていると思いますので頑張ってください^^

    キャンセル

  • 2016/05/25 16:37

    分かりました!
    ありがとうございます!

    キャンセル

0

VBA使わなくてもsumif関数使えば集計できます。
またはピポットテーブルも有効です。

あと、日付は項目として追加しとくとベターです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 11:45

    申し訳ありません・・・
    SUMIF関数の数式をご教示いただけませんでしょうか?

    キャンセル

0

シート一枚でというのはデータのみを記述した表無しでという意味ですか?
例えば、上のシフト表も、下の理想の表も同じシートに書いてしまえばシートは1枚で済みますが、そういうことでは無いのですね?

データ無しだとVBAを使ってもどうしようも無いと思います。
VBAコード中に直接データを記入するなら可能ですが
そんなことをする位なら、データシートを別途用意したほうがましです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 11:59

    データシートを別途用意する場合、hirohiro様のベストだと考えられる関数またはVBAを教えていただけませんでしょうか?

    キャンセル

  • 2016/05/25 12:51

    上のシフト表を元にピボットテーブルでできそうな気がしますが、手元にExcelが無いので実際どうかわかりません。参考サイトのリンクを書いておきます。
    http://hamachan.info/excel/piboto.html

    VBAでやるなら、この辺りをうまく使って
    http://officetanaka.net/excel/vba/tips/tips124.htm
    ['A','8:00','17:00','1:00'],
    ['B','8:00','17:00','1:00'],
    ['C','8:00','17:00','1:00'],
    ['D','','',''],
    ['L','8:00','17:00','1:00']
    このような配列を作って、末端配列の添え字1以降にデータのある配列だけを書き出すようにすれば良いと思います。
    これでイメージが湧かなければ、動くコードを提示するしかなくなりますが、それは本サイトの主旨でも無いと思いますので控えます。

    キャンセル

0

ちょっと求められている動きが見えなくてアドバイスが難しいです。

やりたいこととしては、1枚目のイメージで入力されているデータをもとに2枚目のイメージの状態を作り出したい、ということでよかったですか?

そしてその際、2枚目の状態が1枚目のデータシートとは別シート(2枚目のシート)に出力されるのはいやだ、ということでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 14:16

    やりたいこととしては、1枚目のイメージで入力されているデータをもとに2枚目のイメージの状態を作り出したい、ということでよかったですか?

    ・・・その通りです


    そしてその際、2枚目の状態が1枚目のデータシートとは別シート(2枚目のシート)に出力されるのはいやだ、ということでしょうか?

    ・・・別シートに出力されるのが理想です

    説明不足ですみません。よろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る