『今更聞けない質問なのですが・・』(のん) エクセルは表計算ですよね。 アクセスのように入力したデータを蓄積させることは出来ないのでしょうか。 「テープル」とか「ピポット」とかアクセスで少しかじった単語を見かけたので・・。 もし出来るとしたら「マクロ」とか「言語」を勉強するのでしょうか? エクセルは簡単な表計算ならなんとなくわかるのですが、どこから手を出していいのか分からず困っています。 よろしくお願いします。 ---- このへんから入ってみてください。 (e1L) オートフィルタ http://www.excel.studio-kazu.jp/lib/e1L/e1L.html (kazu) ---- kazuさんありがとうございます。 こんな事ができるのですね。 ちなみにデータの入力の仕方なのですが、今はひたすら右に右に入力をしています。 「カード入力」と言うやり方があると教えてもらったのですが列数が多いとだめと言われました。 アクセスのようにと言うのは入力するときにカード式のようなフォームで入力ができないかなと言うことです。言葉と知識がたりなくてすみません。 数字など横に横に入力しているとミスがあったり見づらくて困っています。 (のん) ---- フォーム入力ありますよ。 http://www.jpita.or.jp/hpv3/ziten/mokutekibetu/ex_13.html   (純丸)(o^-')b ---- ---- 純丸さん どうもありがとうございます。 ただ、探してみたのですが「データ」→「フォーム」の「フォーム」が見つけられません。 エクセルのバージョンは2007で「旧メニュー対応表」で探してみたのですがやはり見つけられません。(>_<) 列数すごく多くて40コぐらいあるのでこれがてきたらすごくうれしい!! 2007の場合どこにあるのかおしえてください!! よろしくお願いいたします。 (のん) ---- 下記が参考になります。 http://oshiete.goo.ne.jp/qa/3493886.html   (純丸)(o^-')b ---- 純丸さん ありがとうございました!! フォームは発見できたのですが・・・「フィールドが多すぎる」と出てしまいました(>_<) これで入力できたらいいのにー!! 他には方法はないでしょうか・・・。 アクセスとかだとテーブル(だったかな?)に分けて入力したり、結構列が多くても入力出来たと思ったのですが、難しすぎて・・。 ---- >他には方法はないでしょうか・・・。 ユーザーフォームを設計してマクロで処理することに なるんでしょうね。 と言うより、そもそもアクセスではいけないのかなと 思ったりしますけど。   (純丸)(o^-')b ---- 純丸さん はい。私がアクセス出来れば問題ないんです(T_T) でもフォームのやり方がわかったのはすごく助かりました。 少ない列数のファイルはこれでやってみます!! 今のファイルはひたすら横に横に入力していきます・・・。 色々とコメントや教えていただいてどうもありがとうございました! (のん) ---- > 今のファイルはひたすら横に横に入力していきます・・・。 そんなに困っているなら、マクロで解決できますよ。 (贅沢な要求がなければですが) 以下、マクロで入力する構想 (1)入力専用のシートを一つ用意する (2)ユーザーは、上から下に入力して行く  ※ 長すぎる様であれば、2列で入力   A列が項目名、B列がデータ、C列が項目名、D列がデータ  それだと、40項目は4列x20行になり、入力し易くなります。 (3)入力が終了したら、本来のシートの最終行に1行自動反映させる。 (4)それと同時に、入力専用シートのB,D列は、自動的にクリアされ、   次の入力に備えられる。 (半平太) 2010/11/19 22:50 ---- そうですね。ユーザーフォームより入力用シートの方が 設計もメンテも入力も楽ですね。   (純丸)(o^-')b ---- 半平太さん、純丸さん、 書き込みがあってびっくりしました。どうもありがとうございます!! マクロって難しそうですけどやってみたいです! (1)(2)についてはわかりました。 (2)はAの列に今まで右に右にあった項目を20個入れていって、B列にそのデータ、Cも21から40までの項目とDにデータを入れていくという事で、見やすく入力しやすいシートを作る。と言うことですよね? (3)入力が終了したら、本来のシートの最終行に1行自動反映させる。の、「自動反映」ってやったことがないのですがどうやったらいいのでしょうか。 すみませんが教えて下さい <(_ _)> エクセルは簡単なことしか判らないのでシロウト同然です(*^_^*)。 よろしくお願いいたします。 (のん) ---- やり取りが続きそうなので〜 行の頭に半角スペース「 」を入れると、文章が成形されますよ ←ここです。 (とおりすがりん) ---- 列数の違う入力があるようなので、構想を少し変えました。 つまり「入力専用ブック」を作ることにしました。 1.構想概要 (1)入力専用のブックを一つ用意する(後で詳しく作り方を述べます) (2)ユーザーは、入力専用ブックB4から入力し、項目の半分が終わると   カーソルが自動的にD4に飛ぶので、続ける感じでまた上から下に入力して行く。 (3)全項目の入力が終了したら、追記すべきシートの最終行の下に自動反映させる。 (4)それと同時に、入力専用シートのB,D列は、自動的にクリアされ、   次の入力に備えられる。 2.以下の手順で入力専用ブックを作ります。  新規ブックを作成して、シート名を「入力元」にでも変えて下さい。  (変えないでも問題はないです)  入力元の「シート見出し」をクリックして、「コードの表示」を選択すると、  VBEが開きますので、中央の白い所に、最後尾に掲示したコードを全部コピペして下さい。  貼り付けたら、VBE の右上の[×]をクリックして閉じ、エクセルに戻って下さい。  「入力専用」と云うファイル名で新規ブックを保存してください。 以上で準備は完了です。 3.入力の仕方   「入力専用」と「処理ブック」が開かれた状態で操作します。   「入力専用」ブックの「入力元」シートのF1セルを右クリックしてください。    ※ 完全白紙状態なので不安かと思いますが、最初だけです。     2回目からはそんなことありませんので安心して下さい。    ※処理を始める時は、いつもF1セルを右クリックしてから始めると覚えて下さい。 すると、自動的に以下の状態になります。  <入力元> 行 ______A______ _B_ ____C____ _D_ _E_ ______F______ 1 ブック名 シート名 1.ブック指定 2 タイトル範囲 2.項目表示 3 ↓データ入力 4 3.書込反映 まず、B1セルを左クリックすると、入力規則のリスト機能でどのブック名を処理するか選べる様になっています。(選んで下さい) 次に、D1セルを左クリックすると、入力規則のリスト機能でどのシート名を処理するか選べる様になっています。(選んで下さい) ※ 順序を間違えない様にして下さい。(ブック名→シート名 の順です) 次に、B2セルにタイトル範囲を手入力してください。  下図<処理1>シートだったら、A1:E1 と入れます。実際はもっと長いから、A1:AM1 とかになるでしょうけどね (^^ゞ  下図<処理2>シートの様であり、かつ性別から入力したければ E3:H3 と手入力します。    (タイトルが3行目から始まっており、性別から入力して行きたい場合です) <処理1>                      <処理2> 行 _A_ __B__ ____C____ __D__ ___ E ___ 行 _D_ _ E _ ____F____ __G__ ____H____ 1 姓 性別 郵便番号 住所 生年月日 1 2 3 姓 性別 郵便番号 住所 生年月日 ブック名、シート名、タイトル範囲が確定したら、F2セル(2.項目表示)を右クリックしてください。 すると項目名が表示されます。項目は半分ずつになります。(半端な数は、C列に余分に出ます) <入力元> 処理1シートを指定した場合の項目名表示後 行 ______A______ _____B_____ ____C____ __D__ _E_ ______F______ 1 ブック名 処理BK1.xls シート名 処理1 1.ブック指定 2 タイトル範囲 A1:E1 2.項目表示 3 ↓データ入力 4 姓 郵便番号 3.書込反映 5 性別 住所 6 生年月日 <入力元>処理2シートを指定した場合の項目名表示後 行 ______A______ _____B_____ ____C____ __D__ _E_ ______F______ 1 ブック名 処理BK1.xls シート名 処理2 1.ブック指定 2 タイトル範囲 E3:H3 2.項目表示 3 ↓データ入力 4 性別 住所 3.書込反映 5 郵便番号 生年月日 項目名に従って、実際にデータを入力してください。  ※ B列最終行にデータを入れると、自動的にD4にカーソルが飛びます <入力元> 行 ______A______ _____B_____ ____C____ ____D____ _E_ ______F______ 1 ブック名 処理BK1.xls シート名 処理1 1.ブック指定 2 タイトル範囲 A1:E1 2.項目表示 3 ↓データ入力 4 姓 鉋音 郵便番号 250-1111 3.書込反映 5 性別 男 住所 東京都 6 生年月日 1947/3/31 入力が終わったら、F4セル(3.書込反映)を右クリックしてください 処理1シートにデータが反映され、今入力したデータはクリアされ、 次行分のデータが入力可能状態になります。以下同様に、データ入力を繰り返えす。 <処理1> 行 __A__ __B__ ____C____ ___D___ ____E____ 1 姓 性別 郵便番号 住所 生年月日 2 鉋音 男 250-1111 東京都 1947/3/31 <入力元>データ入力前の状態になります。 行 ______A______ _____B_____ ____C____ __D__ _E_ ______F______ 1 ブック名 処理BK1.xls シート名 処理1 1.ブック指定 2 タイトル範囲 A1:E1 2.項目表示 3 ↓データ入力 4 姓 郵便番号 3.書込反映 5 性別 住所 6 生年月日 以上です。 (留意事項)  F列(1,2,4)のクリックは全て「右クリック」です。  先頭データが入るB4セルは入力必須とします。空白は許されません。(一応チェックは入っていますが。。。)  初回分は書込んだら、実際に正しく反映していることを確認してから、2行目以降を処理くてください。  (シート名の指定間違い や データ/書式の不備 を初回データの時にチェックしておかないと涙が出る事に・・・・) '貼り付けるマクロ Private Sub Worksheet_BeforerightClick(ByVal Target As Range, Cancel As Boolean) Dim Wbk As Workbook Dim wsh As Worksheet Dim rng As Range Dim bc1Rows As Long Dim bc2Rows As Long Cancel = True Select Case Target.Address Case "$F$1" 'ブック指定 If Workbooks.Count < 2 Then MsgBox "書込ブックを開いてから実行して下さい" Exit Sub End If Application.EnableEvents = False Range("F1:F4").Value = [{"1.ブック指定";"2.項目表示";"↓データ入力";"3.書込反映"}] Range("A1:A2").Value = [{"ブック名";"タイトル範囲"}] Range("C1").Value = "シート名" Range("B1,D1,A4:D50").ClearContents Application.EnableEvents = True setBooksAtB1Cell 'B1セルに入力規則を設定(ブック名) Case "$F$2" '項目表示 If Range("B1").Value = "" Or Range("D1").Value = "" Then MsgBox "B1セルにブック名" & Chr(13) & "D1セルにシート名 を入力してください。" Exit Sub End If If Range("B2").Value = "" Then MsgBox "B2セルに「タイトルのセル範囲」を文字で入力して下さい (例: A1:AG1 )" Exit Sub End If Application.EnableEvents = False Range("A4:D50").ClearContents Application.EnableEvents = True Call identifyObj(Wbk, wsh, rng, bc1Rows, bc2Rows) 'オブジェクト等を特定 Call setItem(rng, bc1Rows, bc2Rows) '項目目を表示 Range("B4").Select Case "$F$4" '書込反映 If Range("B4").Value = "" Then MsgBox "B4セルは必須です。" Exit Sub End If Call identifyObj(Wbk, wsh, rng, bc1Rows, bc2Rows) 'オブジェクト等を特定 Call dataUpdate(wsh, rng, bc1Rows, bc2Rows) 'データ更新 Application.EnableEvents = False Range("B4:B50,D4:D50").ClearContents Application.EnableEvents = True Range("B4").Select Case Else Cancel = False End Select End Sub Private Sub identifyObj(ByRef Wbk As Workbook, ByRef wsh As Worksheet, _ ByRef rng As Range, ByRef bc1Rows As Long, ByRef bc2Rows As Long) Set Wbk = Workbooks(Range("B1").Value) Set wsh = Wbk.Worksheets(Range("D1").Value) Set rng = wsh.Range(Range("B2").Value) bc1Rows = Int(rng.Columns.Count / 2) bc2Rows = rng.Columns.Count - bc1Rows End Sub Private Sub setBooksAtB1Cell() Dim bk As Workbook Dim B1Validation As String For Each bk In Workbooks If bk.Name <> ThisWorkbook.Name Then B1Validation = B1Validation & bk.Name & " " End If Next B1Validation = Replace(Trim(B1Validation), " ", ",") With Range("B1").Validation .Delete .Add Type:=xlValidateList, Formula1:=B1Validation .InCellDropdown = True End With End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Address = "$B$1" Then Call setSheetsAtD1Cell(Target.Value) 'D1セルに入力規則を設定(シート名) ElseIf Range("B2").Value <> "" Then If Target.Address = _ Range("B" & 3 + Int(Range(Range("B2").Value).Columns.Count / 2)).Address Then Range("D4").Select End If End If End Sub Private Sub setSheetsAtD1Cell(B1BookName) Dim wsh As Worksheet Dim D1Validation As String Dim bkNames() For Each wsh In Workbooks(B1BookName).Sheets D1Validation = D1Validation & wsh.Name & " " Next D1Validation = Replace(Trim(D1Validation), " ", ",") With Range("D1").Validation .Delete .Add Type:=xlValidateList, Formula1:=D1Validation .InCellDropdown = True End With End Sub Sub setItem(rng As Range, bc1Rows As Long, bc2Rows As Long) Range("A4:A" & 4 + bc1Rows - 1).Value = _ Application.Transpose(rng.Resize(1, bc1Rows).Value) Range("C4:C" & 4 + bc2Rows - 1).Value = _ Application.Transpose(rng.Offset(0, bc1Rows).Resize(1, bc2Rows).Value) End Sub Private Sub dataUpdate(wsh As Worksheet, rng As Range, bc1Rows As Long, bc2Rows As Long) Dim lastRow As Long lastRow = rng.Cells(9999, 1).End(xlUp).Row With Application .ScreenUpdating = False wsh.Cells(lastRow + 1, rng(1).Column).Resize(1, bc1Rows).Value = _ Application.Transpose(Range("B4:B" & 4 + bc1Rows - 1).Value) wsh.Cells(lastRow + 1, rng(1).Column).Offset(0, bc1Rows).Resize(1, bc2Rows).Value = _ Application.Transpose(Range("D4:D" & 4 + bc2Rows - 1).Value) .ScreenUpdating = True End With End Sub (半平太) 2010/11/22 16:13 ---- 半平太さん ありがとうございますー。 すごすぎてどうしたらいいか固まってます(>_<) 今日家でもう一度しっかり読んでやってみます。 多分わからないことが一杯あると思うのでその時はまた教えて下さい。 よろしくお願いいたします。 (のん) ---- 半平太さん 間があいてしまってすみません。 教えてもらったようにやってみました! 新しくブックを作って2.まではやったのですが、 F1をクリックすると「書き込みブックを開いて下さい」と表示されます。 あと「処理ブック」はどうやったらいいのでしょうか。 教えて下さい。 よろしくお願いします!! (のん) ---- > 新しくブックを作って2.まではやったのですが、 F1をクリックすると「書き込みブックを開いて下さい」と表示されます。 書き込みたいブック(=処理ブック)とマクロの入ったブック(=入力専用ブック)は 同時に開いている状態で操作することになっています。 ※「書き込みブック」が「処理ブック」のことです (^^ゞ > あと「処理ブック」はどうやったらいいのでしょうか。 入力開始時のことでしたら  上述しました通り、両方のブックを開くことになっています。 作業終了時のことでしたら、  両方のブックは、上書き保存して閉じてください。 (半平太) 2010/12/07 18:12 ---- ありがとうございます!! やってみます!! (のん) ---- 半平太さん 何度もすみません。 書き込みたいブック、「処理ブック」は今まである、 横に横に長いエクセルの事ですか? それとも新しく作るものですか? F1をクリックしたらぱっと出てきたので結構感動です。 早く進めたいのですが、 「まず、B1セルを左クリックすると、入力規則のリスト機能でどのブック名を処理するか選べる様になっています。(選んで下さい)」 で選べるのは「書き込み」と表示されるのでこれを選択してますが、 よくわからずに自分が白票で作った「書き込み」と言うタイトルのブックが表示されているのか、 もともと半平太さんがマクロで出てくるようにしてくれたものなのかちょっと不明のまま進めています。 このまま進めていいのでしょうか。 それとももともとの、横に横に長いエクセルブックを「書き込みブック」とするのでしょうか。 この作業中も横に横に長いブックはずっと開いてます。 (のん) ---- >何度もすみません。書き込みたいブック、 >「処理ブック」は今まである、横に横に長いエクセルの事ですか? そうです。 今まで、そのブックに書き込むことに苦しんでいたのではありませんか? それを解消しようとするものです。 今まで通り、チャンと横に長く続くタイトルが書かれているものである必要があります。 私の例では、A〜Eしかありませんが、もっと右(AM列辺り) に続くシートであると想定していますけども。。。   ↓ <処理1>                    行 _A_ __B__ ____C____ __D__ ___ E ___ 1 姓 性別 郵便番号 住所 生年月日 (半平太) 2010/12/07 20:19 ---- > 自分が白票で作った「書き込み」と言うタイトルのブックが表示されているのか、 白票ではタイトルが見えないので、ガイドしてもらえません。 Item01とでも入力してから、右にフィルコピーし、 ガイドになるようなタイトルを書き込んでからテストしてください。 (半平太) 2010/12/07 20:24 ---- やってみますー。 ほんとにすみません。 (のん)