• ベストアンサー

エクセルVBAの記述

エクセルシートで教えてください。 Sheet1 に入力用シートを作成して、Sheet2 にデータを表示されるようにするには、どの様にVBAを記述したらよいでしょうか? 説明 Sheet1 の入力は、日付と入退出の時間です。同日に二回・三回入室すると、同じ日付が二行・三行になります。 Sheet2 の表示は、列が10分単位で24時間表示です。行が1日から31日までの日付です。 サンプル画像のように、Sheet1 に入力した場合に、Sheet2 に赤色で滞在時間を表示するには、どうすればよいでしょうか? Sheet2 のひとつのセルは10分です。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.5

禁止事項は読まれましたか 特に「丸投げ・依頼」の項目 上のようなルールがあるので、エラー処理、解説は省きます Sub test() Dim i As Integer i = 6 Do Until Worksheets(1).Cells(i, 3) = "" With Worksheets(1) Worksheets(2).Range(Cells(.Cells(i, 3) + 6, (.Cells(i, 4) * 144) + 3),Cells(.Cells(i, 3) + 6, (.Cells(i, 4) * 144 + 3) + (.Cells(i, 5) - .Cells(i, 4)) * 144 - 1)).Interior.ColorIndex = 3 End With i = i + 1 Loop End Sub と、言っても、実際は一行で出来る処理なんだけどね、後は繰り返すだけ >条件書式では、三つまでしか設定できません。サンプル画像のように、入力する日付は決まってなく、時間もバラバラとなるとVBAで記述しないと難しいのではないかと思います。 やり方によっては、出来ると思うよ

masa2832
質問者

お礼

VBA初心者で「丸投げ」になってしまいすいません。 Do Until~Loopを初めて知りました。大変勉強になりありがとうございました。 最初に教えていただいたVBAを記述したところ、データの表示にズレがありましたが、 (.Cells(i, 4) * 144) + 3)の部分を (.Cells(i, 4) * 144 + 3))に修正したら無事できました。

その他の回答 (4)

回答No.4

VBAということなので無視していただいても結構です 条件付き書式でもできるのでは? ってことでの回答です 入力してあるデータが読み取れないので推測ですm(_ _)m G,H列を作業列とします 1. G5:H5セル 0 2. G6セル =$C6+D6    右へ下へオートフィル 3. K6セルから範囲指定して 4. 条件付き書式    数式が =MATCH($J6+K$5,$G$5:$G$10)<>MATCH($J6+K$5,$H$5:$H$10)

masa2832
質問者

お礼

条件付き書式も色々複雑な入力があるのですね。 大変勉強になりました。ありがとうございました。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.2です、Sheet1の読み込みが1列ずれていました。 失礼しました。 誤   If Cells(nReadRow, 2) = "" Then Exit Do '空行なら終了   'Sheet2の塗りつぶしエリアの左上はC7、C列が0:00、D列が0:10、EO列が翌0:00   nPaintRow = Cells(nReadRow, 2) + 6 '塗りつぶす行   nStart = Int(Cells(nReadRow, 3) * 144) + 2 'シリアル値に144(=24*6)を掛けて0時から数えて何十分かを演算   nEnd = Int(Cells(nReadRow, 4) * 144) + 2 正   If Cells(nReadRow, 3) = "" Then Exit Do '空行なら終了   'Sheet2の塗りつぶしエリアの左上はC7、C列が0:00、D列が0:10、EO列が翌0:00   nPaintRow = Cells(nReadRow, 3) + 6 '塗りつぶす行   nStart = Int(Cells(nReadRow, 4) * 144) + 2 'シリアル値に144(=24*6)を掛けて0時から数えて何十分かを演算   nEnd = Int(Cells(nReadRow, 5) * 144) + 2

masa2832
質問者

お礼

VBAを記述しましたが、表示時間に少しズレがありました。 入力開始と終了のVBAは少し理解できたのですが、 塗りつぶしの開始と終了が難しく今後も勉強したいと思います。 ありがとうございました。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

時間の塗りつぶしだけ、ヒントになりそうなコードを…… エラー処理等入っていません、あくまでもサンプルです。 Sub Sample()  Dim nReadRow As Long 'Sheet1の入力表を読み込む位置(行)  Dim nPaintRow As Long 'Sheet2の塗りつぶす位置(行)  Dim nStart As Integer 'Sheet2の塗りつぶし開始位置(列)  Dim nEnd As Integer  'Sheet2の塗りつぶし終了位置(列)    Application.ScreenUpdating = False '画面の更新停止  nReadRow = 6 '入力表がC6から始まっている  '入力表を上から順番に読んで行き、空行があったら処理を終了する  Do   Sheets("Sheet1").Select   If Cells(nReadRow, 2) = "" Then Exit Do '空行なら終了   'Sheet2の塗りつぶしエリアの左上はC7、C列が0:00、D列が0:10、EO列が翌0:00   nPaintRow = Cells(nReadRow, 2) + 6 '塗りつぶす行   nStart = Int(Cells(nReadRow, 3) * 144) + 2 'シリアル値に144(=24*6)を掛けて0時から数えて何十分かを演算   nEnd = Int(Cells(nReadRow, 4) * 144) + 2   If nEnd < nStart Then nEnd = nEnd + 144 '退出が日を跨いだ場合用      Sheets("Sheet2").Select   Range(Cells(nPaintRow, nStart), Cells(nPaintRow, nEnd)).Select   With Selection.Interior    .ColorIndex = 3 '色はとりあえず赤    .Pattern = xlSolid   End With      nReadRow = nReadRow + 1  Loop  Application.ScreenUpdating = True End Sub

  • riveron77
  • ベストアンサー率48% (180/370)
回答No.1

セルに式を埋め込む、では駄目なんでしょうか?「Sheet1」の「A1」のデータを表示したいセルに「=Sheet1!A1」と入力するとできます(ご存知かもしれませんが)。 「赤くする」については以下のURLをご参照ください。 【Excel(エクセル)基本講座:条件付き書式の使い方】 http://www.eurus.dti.ne.jp/~yoneyama/Excel/jyo-syo.html

masa2832
質問者

補足

条件書式では、三つまでしか設定できません。サンプル画像のように、入力する日付は決まってなく、時間もバラバラとなるとVBAで記述しないと難しいのではないかと思います。

関連するQ&A

  • Excelで困っています

    エクセルで入退出をしようとしています 基のデータが下記の様になっているのをタイムカード形式に条件を付けて取り出しをしたいのですが上手くできませんでした。 ご教授お願いします。 【元データ】     A         B  1 日時                            ID 2 2010/10/30 21:34    000-0000001 3 2010/10/30 7:47      000-0000006 4 2010/10/30 7:38      000-0000001 5 2010/10/30 0:43      000-0000001 6 2010/10/29 19:22    000-0000001 7 2010/10/29 19:00    000-0000001 8 2010/10/29 18:32    000-0000008 9 2010/10/29 18:31    000-0000007 これをID毎に下記の様に(000-0000001の例)別シートに表示させようとしてもうまくできません。 A       B     C 1  日付  入室時間  退室時間 2 10月30日     7:47           0:43 3 10月29日    19:00    19:22 ※同じIDで同じ日付の入退出が複数ある場合は一番小さい(最初に入室した)時間と一番大きい(最後に退出した)時間をタイムカードの様に並べてその間のではいりは必要ありません。 どうか宜しくお願いします。

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • エクセルVBAについて

    VBAに関しての質問です。 A列に日付(10行目から) B列にその日の売上が 300行(300日分)入力されてる表があるとします。 C列にその日を含めた過去N日間の最大の売上を表示させたいのです。 例えば 過去5日間なら過去5日間の最大売上げを毎日表示させたいのです 当然この場合は5日間なのでCの13行目までは空白になります。 「N」日はA1セルに任意の日数で入力することによって希望の期間の数値 が表示できるようにしたいのです。 関数を使ってできるのいですが、事情がありましてエクセルのマクロの 繰り返しのプログラムでやりたいのですが VBAに関しては全く素人ですの。どなたかご教授願えませんでしょうか よろしくお願いします。

  • VBAで○○:○○と表示させたいのに小数で0.53125のように表示さ

    VBAで○○:○○と表示させたいのに小数で0.53125のように表示されてします。 初心者です。 E101から下に時刻 F101から下に時間(1時間は1、1時間半は1.5)が記入されています。 ユーザーフォームを作成しており、Initialize()に E101とF101を足した時間(12:00+1なら13:00)を 「txt退出時間」に表示させたいと思っていますが、 数値では求められるものの○○:○○となりません。 Private Sub UserForm_Initialize() Dim 行 As Long Dim 退出時間 As Variant txt日付 = Worksheets("○○").Range("B1") txt番号 = Worksheets("○○").Range("U98") Worksheets("○○").Select 行 = txt番号 + 100 退出時間 = Cells(行, 5) + Cells(行, 6) / 24 txt利用時間 = Cells(行, 6).Value txt入室時間 = Cells(行, 5).Text txt退出時間 = 退出時間’ここが上手くいきません txt打込時間 = Cells(行, 17).Text Call リスト更新 End Sub Initializeでは無いのでしょうか?右も左も分かりません。 分かる方宜しくお願い致します。

  • エクセル関数について教えてください

    エクセル関数についてご教授ください。 添付図のようなデータ入力シートがあり入力者は山田、太田、斉藤の3名が入力します。 今、山田さんが7/29日の数学の列の10:40-12:10行のセルに「伊藤」と入力し、太田さんが同日のEnglishの列の13:00-14:30行のセル に「伊藤」と入力し、さらに斉藤さんが同日の国語の列の14:40-16:10行のセルに「伊藤」と入力した場合にsheet2(シート名:伊藤)の表に図で示すようなデータを自動で入力させたいと考えています。 sheet1の日付は横に1週間分あります。同様にSheet2(伊藤)にも同じ日付で1週間分あります。 このようなことは可能でしょうか? エクセル関数初心者で非常に困っています。 どうかご指導いただきたいです。

  • エクセルVBA シートの追加と名前の変更

    エクセルに「原本」シートがあり、マクロを実行すると原本シートを5シート(5日分)追加し、 (1)一つ目に追加したシートのB2のセルに「追加する日の日付け」を入力し、 シート名にその日付をyymmdd形式で名前を付け、 (2)二つ目に追加したシートのB2のセルに「追加する日の次の日の日付け」を入力し、 ・・・同様の処理・・・ (6)一つ目の追加したシートをアクティブシートにする。 というように、連続した5日分のシートを追加したいと考えています。 VBAの全くの初心者ですので教えていただけると大変助かります。 そんな素晴らしいことが短時間で教えていただけるものなのでしょうか。

  • エクセルVBAでご教示ください

    シート1のB5にNo、C5に住所、D5に電話・・・・・CXまで入力したものをコピーして シート2のB列の同じNoの行に貼り付けるVBAをご教示ください。 おこないたいことは、シート2に1500ほどある台帳で、修正をのある行データをシート1に No入力で呼び出し、修正して、修正したデータを元台帳に戻すということを行いたいのです。 No入力で呼び出すVBAは何とか出来ていますが、シート2の同じNoの行に貼り付けるVBAが わかりません。 どなたか、よろしくお願いいたします。

  • ExcelのVBAについて。

    ExcelのVBAについて。 画像のようなコードを利用してセルに入力時の日付時間を自動的に付加させたいのですが、、 VBA初心者な為に上手くいきません。 コード自体はサイトのを切り貼りして使えるのですが、これ以上の応用例に行き着けません。目的としては、データベース的に、あと入力数値から特定文字を抜き出して変数を当て嵌め文字列の語呂を当てます。様式はまだ作成中ですが、ある種の図表化してプリントアウトまでしたいと思っています。 何が上手くいかないか、まず自動的に付加させる所は何となく出来ているので、これをシート1とした場合に、シート2に図表化した転記内容を構成し、、シート1入力、シート2表示、またシート1A3セルに戻るというコードにしたいです。 この記述は不味いとかこうこうああした方が良いというアドバイスや指摘をお願いします。 よろしくお願いします。

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

  • エクセルVBAでのスケジュール作成

    いつも大変お世話になっております。 本日も質問させてください。 会社指定の異なる2つのブックのエクセル表に自分の部署の社員全員のスケジュールを入れなければいけません。 (1つは月間、もう1つは週間で、それぞれ各月、各週毎にシートがあります。) VBAのフォームを作成し、週間スケジュールは自動でセットできるようになりました。 ですが、月間のスケジュールがうまくいかなくて困っています。 (入力フォームは共通のものを使用します。) スケジュールの表はシートが月別になっていてA列に社員名、1行目に日付、2行目に曜日、3行目に祝日が表示されるようになっています。 4行目からが各社員のスケジュールですが、1人の1日分のスケジュール入力のセルは2列×3行=6セルです。 (わかりにくいので図で表現したかったのですが、ずれて表示されてしまって余計にわかりにくいのでやめてみました。ちなみに、1人目の1日目のスケジュールのセル範囲はB4:C6となります。) そして、各セルには入力する項目が決まっています。 (この項目についてはフォームで作成済みです。) セルが多いため、Rangeを使おうと思っても指定するのが困難です。 個人的にはRangeのセルの値を別シートに作成した表からindexで検索できたらなぁ。と思っています。 できるかどうかすらわかっていませんが。(汗) もちろん、もっと効率的な方法があればそちらを教えていただきたいです。 週間スケジュールのセルから入力値をもってくる事も考えたのですが、月間は1日から必ず始まっていますが、週間は月曜日からのため、月や週によって日付が異なることなどから、やはり私には難しいのです。 よろしくお願いします。

専門家に質問してみよう