アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。アクセスでデータを入力するフォームを作っているのですが、月とNoと内容というフィールドがあったときに、今までは、その月に使用する分のレコードをエクセルで作成し、テーブルに貼り付けていました。この作業をボタンを押すと「月を入力して下さい」、「No(始まり)を指定してください」、「NO(終わり)を指定してください」とメッセージを表示し、自動でその分のレコードが追加されるというようにしたいのですが、どうすればよいですか?
ご指導のほど、よろしくお願いします。

<テーブルイメージ>
月 No 内容
5月 1 (空欄。入力者がその都度、Noを指定して開き、入力)
5月 2
5月 3

↑ボタンを押すと自動でレコードと追加したい。

A 回答 (3件)

VBAでやりたかったんですね。

最初からそういう風に質問して下さい。そう言われないと、できるだけ基本機能で対応できるように考えて回答してしまいます。最初から、ループさせて作る方が早いのは解っていましたが、質問者様がどれくらいの知識をお持ちなのかも解らず、こちらもどこまでもフォローできるわけではないので、誰でもメンテナンスしやすい基本機能をわざわざ検討しての回答でした。最初からご自分で検討されたVBAのコードを載せて頂いたらそれに対してのコメントのみで済んだのです。それと、こちらに書かせて頂くのは筋違いかもしれませんが、最近、ご自分で何の検討もされずに「こういうことがやりたいのでコードを書いて下さい」という質問が目につきます。VBAといえどもプログラムは知的財産であって、本来ならお金を払って依頼するものです。ご自分でやられるなら、何かしら自分でコード書いて意見を求めるのが筋だと思います。質問者様がどういうつもりでご質問されたのか解らずにこんなことを書かせてもらってすいません。

さて、補足に載せて頂いたコードへのコメントですが、
>   ipt1 = InputBox("月を入力して下さい")
>   ipt2 = InputBox("No始まりを指定してください")
>   ipt3 = InputBox("NO終わりを指定してください")
ここで「キャンセル」を選んだ場合、や数値以外が入力された場合、
>For i = ipt2 To ipt3
の部分でエラーが発生します。せめてエラートラップでデバックウィンドウが開かないようにだけはしておかないと、何もわからない使用者が驚いてしまいます。
私なら、
 Public Sub rensyu1()
  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim i As Integer
  Dim ipt1 As Integer 'Stringではなく数値のみにします
  Dim ipt2 As Long 'Stringではなく数値のみにします
  Dim ipt3 As Long 'Stringではなく数値のみにします
'エラーの時は抜けます。
On Error GoTo rensyu_Exit  
   ipt1 = InputBox("月を入力して下さい")

'1以上12未満の入力以外は13:型エラー
If ipt1 < 1 Or ipt1 > 12 Then Err.Raise 13

   ipt2 = InputBox("No始まりを指定してください")
   ipt3 = InputBox("NO終わりを指定してください")
'インプットボックスでエラーがあればrs・cnはNothingになるようにします。
  Set cn = Application.CurrentProject.Connection
  Set rs = New ADODB.Recordset
  rs.Open "test", cn, adOpenKeyset, adLockOptimistic
    For i = ipt2 To ipt3
    rs.AddNew
    rs!Mon = ipt1 & "月" '入力は数字のみにしてここで「月」を足します。
    rs!No = i 'ipt2ではなくiの値にします。
    'rs!naiyo = "" ----空白が許可されているならこれは省きます。
    'ipt2 = ipt2 + 1 ---- iの値が勝手に連番を振ってくれます。
    Next i

   rs.Update
   rs.Close
   cn.Close

rensyu_Exit:
If Err.Number > 0 Then MsgBox ("追加されませんでした")
Set rs = Nothing
Set cn = Nothing
  End Sub
ですかね。
    • good
    • 0
この回答へのお礼

ご丁寧にご回答くださり、ありがとうございます。アクセスの機能もどこまで出来るのか分からないため、自分自身いろいろ試しているところです。こちらのサイトでも何かヒントになるものがあるかと思い、質問してみました。コードも使用できそうなサンプルを探していろいろ加工しているので、正直ひとつひとつの構文の意味は分からない状態です。
レコードの追加も実はまだ追加したいテーブルが複数あるため、これを一括して行えるように加工してみようと思っています。エラー処理も少し勉強して加えられるようにしようかと思っています。ご回答くださった回答を参考にさせてもらいます。今後もよろしくお願いします。

お礼日時:2007/04/19 16:07

はい。

でも、毎回作るのではなくて、最初に作るだけです。なので最大値を「絶対こんなに使わない」ってとこまで作ります。その後は、毎月クエリを開く作業をすればデータが追加されます。もし万が一、Noが最大値を越えるようなことがあれば、その時は(1)テーブルに追加すればいいんです。その後は又、そのNo未満の番号の使用ならそのまま使えます。

1度の作業でも面倒だとおっしゃるなら、お金を出して誰かに開発してもらうしかないでしょう。

この回答への補足

とくに今までのやり方も面倒なわけではなかったのですが、新しい人も使用するために、みんながわかりやすいものを作成しようと思っています。
いろいろな資料をみて下記のモジュールを作成してみたのですが、どなたかここは違うというところがあれば教えてください。(モジュールも初めて作成するので自信がありません。特にループの入れる場所も適当です・・・)
 Public Sub rensyu1()
  Dim cn As ADODB.Connection
  Dim rs As ADODB.Recordset
  Dim i As Integer
  Dim ipt1 As String
  Dim ipt2 As String
  Dim ipt3 As String
  
  Set cn = Application.CurrentProject.Connection
  Set rs = New ADODB.Recordset
  rs.Open "test", cn, adOpenKeyset, adLockOptimistic
   ipt1 = InputBox("月を入力して下さい")
   ipt2 = InputBox("No始まりを指定してください")
   ipt3 = InputBox("NO終わりを指定してください")
    For i = ipt2 To ipt3
    rs.AddNew
    rs!Mon = ipt1
    rs!No = ipt2
    rs!naiyo = ""
    ipt2 = ipt2 + 1
    Next i
   rs.Update
   rs.Close
   cn.Close
  End Sub

補足日時:2007/04/18 17:14
    • good
    • 0

(1)NOというフィールドのみ持つテーブルを作成し、考えうる最小NOから最大NOまでを入力します。

最小は0になると思うのですが、平均50まで使うなら100までというように余裕をもった最大NOにしておきます。

(2)デザインビューでクエリを作成し、(1)で作ったテーブル(ここでは「T_Num」とします)を表示させ、クエリの種類を追加クエリに設定します。追加先はもちろん追加したいテーブルです。クエリのフィールドは下記のようにして下さい。

フィールド    月:[月を入力して下さい]        NO
テーブル                          T_Num
レコードの追加   月                   No
抽出条件                          >=[No(始まり)を指定してください] And <=[NO(終わり)を指定してください]

(3)作成したクエリを保存し、閉じたら、開こうとして下さい。すると、メッセージが表示されご希望のようにレコードが追加されると思います。

この回答への補足

(1)の作業はやはり予め入力していないと駄目ですよね・・・。

補足日時:2007/04/18 13:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!