エクセルで予約データを入力する方法とは?

このQ&Aのポイント
  • エクセルで縦横共に日付が入った表があり、縦は現在、横は2か月先~の日付が入っています。予約日と予約件数を入力するフォームやシート上の決まった箇所に入力すれば、指定した予約日に件数が入力されるようにしたいと思っています。
  • 現在の日付と予約日を入力し、予約件数を入力するフォームやシート上の決まった箇所にデータを入力すれば、指定した予約日に件数が自動的に入力される方法が知りたいです。
  • エクセルの表には縦に現在の日付、横に2か月先までの日付が入っています。予約日と予約件数を入力するフォームやシート上の決まった箇所にデータを入力すれば、指定した予約日に指定した予約件数が自動的に入力されるようにしたいです。
回答を見る
  • ベストアンサー

予約データの入力

エクセルで縦横共に日付が入った表があり、縦は現在、横は2か月先~の日付が入っています。 例えば6月4日に8月3日の予約が3件入った場合、セルE7に3と入力します。 ここで、縦で使用するのは当日の行だけなのですが、横には2か月先~の列が並んでおり(半年ほど)、入力する箇所も不規則なので、入力箇所にセルで移動するのを省くために、フォームかシート上の決まった箇所に入力すれば、指定した予約日に件数が入力されるようにしたいと思っています。 VBAを使用する事になるかと思われますが、私のVBAのレベルが低い物で全く想像つきません。 (私のレベルはネット等で検索して見つけたコードを自分用に置き換えて使っている程度で、自作は本当に簡単なものしか出来ません。) 一応分かりにくいかもしれませんがイメージの画像を添付しておきます。 上が表で、下にあるのが入力部分になっています。 現在日付は=TODAY()で出力し、予約日・件数は毎回入力、移行ボタンを押せば上の表に飛ぶといった具合です。 よろしくお願いいたします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 質問では >例えば6月4日に8月3日の予約が3件入った場合、 とありますが、6月4日とはTODAY()関数が入っている日付になるのが一般的な考え方ではないでしょうか? そこで余計なお世話かもしれませんが、表のレイアウトを変えてみました。 ↓の画像で説明させていただくと・・・ 通常A列は「受付日」となり、列方向に「予約日」になると思います。 日付に関してはシリアル値の方が都合が良いので、 A6セル(セルの表示形式はユーザー定義から m/d(aaa) としておきます)に表示したい最初の日付を入力し オートフィルでずぃ~~~!っと下へコピー! 列方向の同様(セルの表示形式を含め)に B5セルに表示したい最初の日付を入力 → 列方向にオートフィルでコピー! 以上の下準備ができた上での一例です。 画像ではコマンドボタンを挿入 → コマンドボタンのコードを Private Sub CommandButton1_Click() Dim i As Long, j As Long If Range("B2") = "" Then MsgBox "予約日が未入力です" Range("B2").Select Exit Sub ElseIf Range("B3") = "" Then MsgBox "獲得件数が未入力です" Range("B3").Select Exit Sub End If i = WorksheetFunction.Match(Range("B1"), Range("A:A"), False) j = WorksheetFunction.Match(Range("B2"), Range("5:5"), False) Cells(i, j).Select Selection = Range("B3") End Sub としています。 これでB1には =TODAY() と関数を入れておき、B2・B3セルを入力 → コマンドボタンをクリック これで何とかご希望に近い形にならないでしょうか?m(_ _)m

この投稿のマルチメディアは削除されているためご覧いただけません。
tgc5244
質問者

お礼

tom04様、回答ありがとうございます。 お礼が遅くなり申し訳ありません。 私がこんな感じでできないかな~と思っていたのが正にこちらです。 受付日は基本当日なんですが、ごく稀に遡る事があるため(入力忘れです・・・)直接日付を入力する事があります。 ですので、ワークシートを開くと、セルB1に=TODAY()関数を入力するようなマクロを組んでみます。 tom04さんのコードはこれから1行ずつ解読し勉強してみます。 ありがとうございました。

tgc5244
質問者

補足

少しアレンジしまして下記のコードでうまく起動できました。 コマンドボタンだとマウスに持ち替えないといけないので、Worksheet_changeをつかってB3のセルに入力後、Enterを押すと起動し、B1に戻り=TODAY()を入れるといった風にしました。 ありがとうございました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$3" Then Dim i As Long Dim j As Long If Range("b2") = "" Then MsgBox "予約日が未入力です" Range("b2").Select Exit Sub ElseIf Range("b3") = "" Then MsgBox "件数が未入力です" Range("b3").Select Exit Sub End If i = WorksheetFunction.Match(Range("B1"), Range("A:A"), False) j = WorksheetFunction.Match(Range("B2"), Range("6:6"), False) Cells(i, j).Select Selection = Range("b3") Range("b1").Select Range("b1").Value = "=today()" End If End Sub

その他の回答 (4)

noname#215107
noname#215107
回答No.5

No.1です。 VBAを使うのはいいのですが、小規模中規模にかかわらず、メンテナンス性を考慮しなければなりません。他の人がそのVBAのコードを変更したい場合に、分かりやすくするための配慮をして設計できますか? プログラミングの経験がある人は、それなりの作法を知っています。 それができなければ不用意にVBAを使わないほうがいいでしょう。 ピボットテーブルだけで作ってみました。 あくまでも一例です。

この投稿のマルチメディアは削除されているためご覧いただけません。
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

お示しの予約状況の表ですが右横方向に8月からの日付が、縦方向には予約日が入力されお互いの日の交わる位置に予約の件数を入力する表となっています。非常に見づらく利用しにくい表となっています。 エクセルの特徴を活かすには入力された日付の順にデータが下方に並んでいくようにすることでしょう。入力の実績を時系列で分かるようにしておくことでしょう。 マクロによる入力ではしばしば時系列などで記録に残るといったことはなくなりますね。出来るだけ関数などを使って対応することでしょう。例えば次のようにすることでしょう。 入力の基礎データをシート1に入力し、シート2ではお求めのようなデータを見やすい形で表示するようにします。 例えばシート1ではつぎのようにします。 A1セルに日付、B1セルに曜日、C1セルに予約者名、D1セルに予約日、E1セルに当日獲得数、F1セルに前日までの獲得総数、G1セルに当日までの獲得総数、H1セルは空のままでI1セルには作業列とそれぞれ項目名を入力します。 A列からB列を除いたE列までについては2行目以降にデータを入力していきます。 B2セルには次の式を入力して下方にドラッグコピーします。 =IF(A2="","",TEXT(A2,"aaa")) F2セルには次の式を入力して下方にドラッグコピーします。 =IF(D2="","",SUMIF(D$1:D1,D2,E$1:E1)) G2セルには次の式を入力して下方にドラッグコピーします。 =IF(D2="","",E2+F2) I2セルには次の式を入力して下方にドラッグコピーします。 =IF(D2="","",D2&"/"&COUNTIF(D$2:D2,D2)) 以上でシート1での作業は終わります。 シート2ではA1セルに予約状況の文字を、A2セルには日付、B2セルには曜日、C2セルには総獲得数、D2セルには予約の状況とそれぞれ項目名を入力します。 A3セルから下方には例えば8月1日からの日付を入力します。 B3セルには次の式を入力して下方にドラッグコピーします。 =IF(A3="","",TEXT(A3,"aaa")) C3セルには次の式を入力して下方にドラッグコピーします。 =IF(SUMIF(Sheet1!D:D,A3,Sheet1!E:E)=0,"",SUMIF(Sheet1!D:D,A3,Sheet1!E:E)) D3セルには次の式を入力して右横方向にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(C3="","",IF(COUNTIF(Sheet1!$I:$I,$A3&"/"&COLUMN(A1))=0,"",TEXT(INDEX(Sheet1!$A:$A,MATCH($A3&"/"&COLUMN(A1),Sheet1!$I:$I,0)),"m月d日")&"/"&INDEX(Sheet1!$E:$E,MATCH($A3&"/"&COLUMN(A1),Sheet1!$I:$I,0)))) D列には例えば6月3日に8月4日5件の申し込みが有った場合にはA列の8月4日の行の位置に6月3日/5のように表示されます。後日6月6日に3件の申し込みが有った場合にはE列の同じ行に6月6日/3のように表示されます。 お示しの表のような場合には離れたセルにそれらが表示されることになってしかも上の日付と、左端の日付を見なければわからないということになりますね。 以上のような表になりますが関数での表示では一度式を入力してあれば後は自動的に表示されますのでデータ入力操作ボタンなどをクリックすることも必要なくどなたでも対応できることになりますね。 長々と説明しましたが一度是非試してみてください。参考になりましたら幸いです。

tgc5244
質問者

お礼

KURUMITO様、回答ありがとうございます。 お礼が遅くなりすみません。 現在の表が私が作ったものではなく、そのまま引き継いだので、そのままどうにか出来ないかと思っていましたが、KURUMITOさんの式による表もかなり使い勝手よく作れそうですね。 これは少し表そのものを見直してもいいかもしれません。 現状だと縦はいいとして横に長すぎるのが結構面倒ですので・・・ 大変参考になりました。 ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

ちなみにそういうお仕事だと、記入した獲得件数は、現在までの予約件数に「加算される」という説明がヌケてるんじゃないでしょうか。 それともホントに更新し(書き換え)ちゃっていいんでしょうか? #余談 >横には2か月先~の列が並んでおり(半年ほど) というお話だと、あなたが用意したサンプルの画像でそこに「8月」が記入されてたら変ですね。 本題。 C2セルに「8/1」と記入、右向けに半年ほどオートフィルドラッグ C3セルに =C2 と記入、右向けにオートフィルドラッグ A4セルに「6/1」と記入、下向けにてきとーにオートフィルドラッグ B4セルに =A4 と記入、下向けにオートフィルドラッグ それぞれセルの書式設定の表示形式で適切に表示を調整する ちなみに10行目からデータ入力してしまうと6/1以下とばっちし重なっちゃいますが、まぁそのぐらいは自力で修正してもらうことにして。 手順: ALT+F11を押してVBE画面を出す 挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける sub macro1()  dim r as long  dim c as long  on error goto errhandle  r = application.match(range("C11"), range("A:A"), 0)  c = application.match(range("C12"), range("2:2"), 0)  cells(r, c).value = cells(r, c).value + range("C13").value ’オプション:マクロを使う方法では、誤操作で「うっかりもう一回クリック/あれ今クリックしたかな?まだだっけ?」を予防できません  cells(r, c).clearcontents  exit sub errhandle:  msgbox "日付がありません" end sub ファイルメニューから終了してエクセルに戻る シート上にオートシェイプとかテキストの追加とかで「データ移行ボタン」を準備、右クリックしてマクロの登録する。

tgc5244
質問者

お礼

keithin様、回答有難うございます。 お礼が遅れましてすみません。 予約件数の加算(縦の合計)はずっと下の方で行っているので大丈夫です。 あくまで当日に受けた予約件数を入力する表になっております。 コードの記述、ありがとうございます。 こん感じでと思っていたように入力できました。 application.matchは使った事がなかったので、この期会に勉強しておきます。 ありがとうございました。

noname#215107
noname#215107
回答No.1

面倒くさい設計をしましたね。 データ形式は以下のようにしたらいいと思います。(あくまでも例ですよ!) csv形式で保存 "受付日","予約日" "6/1/2013" , "8/1/2013" "6/1/2013" , "8/2/2013" "6/1/2013" , "8/3/2013" "6/2/2013" , "8/1/2013" "6/3/2013" , "8/3/2013" "6/4/2013" , "8/5/2013" この順番ではなくても、データの発生した順番で良いです。 これを入力する順番は、VBAやフォームを利用して順不同に入力すればいいです。 最後に表を作りたいときに、ピボットテーブル等で、添付なさった画像のような表にしましょう。 つまり、入力するときのスタイルと、完成した出力のスタイルは別に考えましょうということです。

tgc5244
質問者

お礼

TXV12003様、回答ありがとうございます。 お礼が遅くなりすみません。 元々私が作った表ではないのですが、面倒な設計になっております。 ご指摘下さったピボットテーブル、あまり使ったことが無かったのですが、試してみたらかなり簡単に縦横の表示が出来ました。 実際の表に適応出来るかやってみます。 ありがとうございました。

関連するQ&A

  • Excelで、横並べのデータを縦並べにリンクを貼りたい

    エクセルにおいて、A1セル、B1セル、C1セル・・・と横に不連続な日付を並べた表があります。 日付は毎日追加していきます。入力された日付を別のシートに"="を使ってリンクを貼っておきたいのですが、リンク先では横ではなく縦にA1、A2、A3・・・と並べていきたいと思っております。 ちなみに、いったん別シートにA1セル、B1セル、C1セル・・・と横にリンクを貼った後、コピー→形式を選択して貼り付け(行列を入れ替える)で縦にしようとしてもうまくいきませんでした。 なお、その都度値複写をすることは考えておりません。 良い方法をご存知の方いらっしゃいましたら教えていただきたくお願いします。

  • Excelのセルに指定した色をつけたい

    データセル縦20×横31の表が2つ、上下に並んでいます。 一方の表(A)のセルに3~20までの数字を入力すると、もう一方の表(B)の、場所が対応したセルに、Aの番号をカラーパレットの番号とした色をつけたいのです。 縦は氏名、横は日付で、グループ編成の色付スケジュール表を作るのが目的です。 自動更新、または、Aに数字を入力後F9による手動更新、いずれかの方法によるVBAを考えています。 VBA初心者のため、手がかりを教えていただきたいと思います。宜しくお願いします。

  • エクセルのデータを書き換えられないようにする方法

    こんにちは。  エクセルで予約表を作って、ネットワークに入れています。縦には時間、横には曜日(時間割みたいな感じです)となっています。10名の先生が、予約を取った時間のセルに自分の名前を入れていくようにしています。   しかし、先生が間違って(おそらく)先に予約をとっているところに他の先生の名前を消して、自分の名前を入れてしまいます。  これをできないようにしたいのです。 思いついたのは、セルのロックですが、いちいちするのは面倒だし、実際には忙しくてできません。  よい方法があるでしょうか? *いったん入力が行われると、自動的にろっくがかかるようにする。 *入力が行われると、自動的にセルに網掛けがかかるようにする。(注意を促すだけですが。) 上記のことは可能でしょうか? 他によい方法があれば、どうか教えてください!

  • セルへの入力によって、特定の者にメール送信したい。

    セルへの入力によって、特定の者にメール送信したい。 エクセルを使って、仕出し弁当の注文を受け付けています。 縦方向の氏名、横方向に月日とした表を作成しています。 縦横の交わりから、誰がいつ注文したかを検知しています。  誤注文(他人のセルへの入力)を検知するために、セルへの入力に基づいて1回だけメール送信するようにしたい。  エクセルの機能だけで、実現できないでしょうか。

  • 予約表を作りたい

    パソコンで予約表を作りたいのですが、どう作ったらいいでしょうか。 表自体は、縦が時間軸、横がテーブル番号というシンプルなものです。 とりあえず、エクセルで1つのセルに「17:00」その下のセルに「17:30」 ・・・・と、30分単位で各セルに時間を書いたものを作ってみたのですが、 そこに線を入れると学校の時間割表みたいな感じになります。 できれば、定規のメモリみたく時間の真横に線があって 17:00―――――――        ○○さま 17:30―――――――        △△さま 18:00――――――― という感じで、線と線の間に予約の名前を書き込むものを作りたいのですが・・・    作ることは可能でしょうか? ワードで時間を書いて線を引くくらいしか思いつかなくて。 どうやって作ったらよいかご指導ください m(__)m

  • マクロで縦と横の交わるセルに値を入力したい

    現在、マクロを使って家計簿をつくっています。 いま悩んでいるのが表の中で縦と横の項目が交わるセルに特定の値を入れたいのですが、それができなくて悩んでいます。 具体的には縦には日付、横には食費などのお金を使った項目が入ります。 助けてください。お願いします。

  • エクセルの関数を教えてください

    エクセルで(シート1)に日付を縦に3か月分ぐらい並べて違うシート(シート2)のセルに日付を入力します。 (シート2)で入力した日を(シート1)の日付の横のセルに●を表示させる事は関数で可能ですか? 例えば、(シート2)に【7月20日】と入力したら(シート1)の【7月20日】の横のセルに●を表示させたいんです。 仕事の報告書で毎日報告書を出す訳ではないので報告書を作った日(日付を入力した日)を一覧表で●が表示されていれば一目でいつ報告書を書いたか分かるようにしたいんです。 分かる方よろしくお願いします。

  • エクセルの横長の表の行のデータの有無の探し方

    エクセル2003で、列も行も多い表を作りました。印刷する事は無く、画面上でデータ管理のみに使います。特に横方向にセルが多く、A~Z、AA~AZと今後それ以上増える見込みで、縦のセルも今後増えます。 なじみ易い例で仮に説明すると、項目名として、1行目には横方向に、A列には縦方向にそれぞれ草野球チームの名前を1セル1チームずつ入力していき、縦と横の交わった地点にあるセルにその2チームの過去の対戦年月日を入力したようなものです。 質問ですが、例えば、A30のセル(あるチーム名)を一旦ポイントし、その右側に対戦年月日が入力されているセルがあるかどうかを調べる場合に、いちいち右端までスクロールしながら目視で確認しなくてもわかる方法があれば教えてください。日付は2013/9/29のように入力しています。

  • ワード(文字入力)

    ワードで横入力で、文章を作成してます。表を作成して、その中から3ヶ所だけ、縦で文字入力したいのですが?又、横の文章の入力で行を変えずに1ヶ所、1単語だけ多少文字数が長くなるので2行(フォントサイズは、小さくなっても)での入力が可能ですか?宜しくお願いします。

  • EXCELで入力文字の表示されない

    EXCEL2000で配布予定表を作っています。 縦に日付、横に日時を入れ、セルを結合したり、表部分は罫線で囲み、 下段、表外にコメントを書いたりするのですが、時々、入力した 全文がプレビューで表示されず、尻切れになったり、コメントボックスに書こうとしてもセルに関連づけだか何かで、やっぱりプレビュー 表示されません。 推定原因と、解決方法をお教えいただければ幸いです。 よろしくお願いいたします。m(__)m

専門家に質問してみよう