• ベストアンサー

アクセスのVBEの初歩的な質問

アクセス(に限らないとは思うのですが)のVBEを今、一生懸命勉強しているのですが、初歩的なところで、つまずいています。 あああ いいい ううう えええ 1 1 あいうえお かきくけこ 1 2 あいうえお かきくけこ 1 3 あいうえお かきくけこ 2 1 あいうえお かきくけこ 2 2 あいうえお かきくけこ 2 3 あいうえお かきくけこ 3 1 あいうえお かきくけこ 3 2 あいうえお かきくけこ 3 3 あいうえお かきくけこ というような、データを自動で入力したいのです。多分、for next と、do until あたりを組み合わせるとできると思うのですが、どうしてもうまくいきません。 とりあえず、以下のような、めちゃめちゃ効率の悪いコードを書いたのですが、もっと効率よくするには、どうしたらいいでしょうか?  ………………………………………………… Private Sub コマンド6_Click() Dim Aaa As Integer Dim Bbb As Integer Dim Ccc As String Dim Ddd As String DoCmd.GoToRecord , , acFirst Aaa = 1 Bbb = 0 Ccc = "あいうえお" Ddd = "かきくけこ" For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 2 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 3 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i End Sub …………………………………… ほんとうに、おはずかしいのですが、どうかご指導くださいませ。m(__)mm(__)m

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

  • ベストアンサー
  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.1

Dim dbs As DAO.Database Dim rst As DAO.Recordset Dim lngIdx1 As Long Dim lngIdx2 As Long Set dbs = Currentdb Set rst = dbs.OpenRecordset("テーブル名") For lngIdx1 = 1 To 10   For lngIdx2 = 1 To 3     rst.AddNew       rst!あああ = lngIdx1       rst!いいい = lngIdx2       rst!ううう = "あいうえお"       rst!えええ = "かきくけこ"     rst.Update   Next lngIdx2 Next lngIdx1 Set rst = Nothing Set dbs = Nothing でどうでしょうか? #「ツール」→「参照設定」で、  Microsoft DAO 3.x Object Library にチェックを入れてください。  

maimai01
質問者

お礼

ありがとうございました~!! テーブルに入力するのに、こういう方法を使うのですね! ほんとうに初心者なもので、何も知らなくて。。おはずかしいです。 おかげさまで、やりたいと思っていたことができました。とってもとってもうれしいです。もう気分爽快。るんるん気分です。 さぁ、これから、どこかへ出かけようかな。。(^^) ほんと、ありがとうございました。m(__)mm(__)m

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

DoCmd.GoToRecord , , acFirst が気になって、質問のような場合、通常下記になるのではないかと思い、参考までに、解説本などにのって入るレベルで記して見ます。 ご参考にして下さい。 質問の例と少し違いますが、ポイントは、ずれてないと思います。 '------ エクセルでは、心の中でこの列は何の項目を入れようと決心し、そのデータをその列の各行に入れて行けばそれで良い。まあ項目名ぐらいは第1行目に入れるでしょうか、入れなくてもエラーではない。 しかしアクセスは、まず「テーブル」の定義で、フィールド(=項目、列に当たる)の定義が必要です。この点面倒とか、判り難い点かもしれませんが、昔のコンピュター初期のパンチカードシステムのビジネス・プログラム時代からずっと、これがフィールド定義をすることが、先行するのは当然でした。 (1)ツール-参照設定-Microsoft DAO 3.6 Libraly (2)テーブル定義をプログムで行う。 普通は操作で、(A)デザインビューから(B)ウイザードを使って(C)データを入力してのどれかで行うのがアクセスの既定路線です。 しかしVBAを使うなら、私はプログムで行うのをお勧めします。いつか役立ちます。 Sub test02() Dim dbs As Database Dim tdf As TableDef Dim fld As Field Set dbs = CurrentDb Set tdf = dbs.CreateTableDef("会員名簿T")  With tdf .Fields.Append .CreateField("番号", dbText, 5) .Fields.Append .CreateField("姓名", dbText, 10) .Fields.Append .CreateField("名前", dbText, 10) .Fields.Append .CreateField("カナ名", dbText, 20) .Fields.Append .CreateField("住所", dbText, 20) End With dbs.TableDefs.Append tdf End Sub 項目の数、フィールド名、データの型、長さなどを変えて上記を実行するだけでテーブルは瞬時に完成します。 (3)さてテーブルにデータをプログラムでセットします。普通は(A)画面入力操作によるか(B)インポートしてきます。 データは各行(レコード)で変化しますので、プログラムでセットするには限りがありますが(少数なら配列にデータをもってやれないことは無い)、下記では「番号」など規則的に変えれば良いところは、プログラムで変化させてセットし、変化する名前などはマニュアルインプットする方式もあり得ますよね。 下記例では名前等は第2レコード以下同じで現実的でありませんが、その点判ってください。 Sub test01() Dim dbs As Database Dim tdf As TableDef Dim rs As DAO.Recordset Set dbs = CurrentDb Set tdf = dbs.CreateTableDef("会員名簿T") Set rs = dbs.OpenRecordset("会員名簿T", dbOpenTable) '------ For i = 1 To 5 rs.AddNew n = Format(i, "00000") rs("番号") = n rs("姓名") = "山田" rs("名前") = "三郎" rs("カナ名") = "ヤマダ サブロウ" rs("住所") = "京都市" rs.Update Next i rs.Close dbs.Close End Sub (注)Dim rs As DAO.RecordsetのDAOが必要な理由 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B181542 参照 (4)後は質問のように対応するには For i=1 to 3 (フィールドデータ処理) Next i For i=1 to 3 (フィールドデータ処理) Next i For i=1 to 3 (フィールドデータ処理) Next i を順に並べ、上記例から(フィールドデータ処理)の部分(私の例でのForNextの部分)をコピーペして、少し整えれば良いと思います。 上記例は、あとSQL関係を勉強すれば、自分で仕事に使うような場合なら(注)、相当広範囲に応用できるものと思います。印刷が残ってますが。 (注)他人に使ってもらうときは、フォームなどで整えないといけないですが。

maimai01
質問者

お礼

アドバイス、ありがとうございます。m(__)m アクセスのVBAの勉強、まだ始めたばかりで、テーブルに直接値を入力できなかったので(^^; フォームを作って、そこから入力させようとしていました。 Gin_Fさんの回答で、そっかぁ。直接テーブルに入力するのは、こうすればいいのか!! ていうことと、それから、for next を複数使ってやる方法を知ることができて、とっても喜んでいました。 今度はimogasiさんのアドバイスで、VBAを使って直接テーブルを作れることもわかりました。ほんとうに少ぉしずつではありますが、VBAがわかってきて、とってもうれしいです。どうもありがとうございました。 これからも、よろしくお願いいたします。m(__)m

関連するQ&A

  • エクセルのマクロについて教えて下さい。

    エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、           A         B   C  D   E  F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、     A B  C  D   E   F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。

  • Access 最後のレコードに到達するまでループ処理を行う方法

    いつもお世話になっております。 フォームでボタンをクリックすると、 計上年度と計上月をすべてのレコードに入力させようとしています。 下記のように、For~Nextで書いてみたのですが、 選択されているレコードが、一番最初のレコードではない場合、 エラーが返ってしまいます。 おそらく「レコードの数分繰り返す」という書き方のせいだと思います。 これを「最後のレコードに到達するまで」としたいのですが、 どのように書いたらよいでしょう?? ご存知の方がいらっしゃいましたら、教えてください。 Private Sub 計上年度月入力_Click() Dim Max As Integer Dim i As Integer Max = DCount("[計上月]", "年次請求集計Q") For i = 1 To Max If 計上月 <> 0 Then DoCmd.GoToRecord , , acNext Else 計上年度2 = 計上年度1 計上月2 = 計上月1 DoCmd.GoToRecord , , acNext End If Next i End Sub

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • 複数の列を繋げてA列に入れたい VBA

    aaa aaa  bbb aaa  bbb  ccc aaa (A列にaaa、B列にbbb、C列にcccが入ってます) と言うデータがあるのですが 全てA列に入れて aaa aaabbb aaabbbccc aaa としたいです。 ・最終列は必ずしもCではないのです。(Dの場合もEの場合もある) ・最終行も変化します。 Sub 分かれてる列を繋げる() Dim Col As Long Dim Row As Long For Row = 1 To Range("a65536").End(xlUp).Row   For Col = 1 To Cells(Row, 256).End(xlToLeft).Column    Cells(Row, 1) = Cells(Row, 1) & Cells(Row, 2) & Cells(Row, 3)    Next Col Next Row End Sub をやってみましたが、 aaa aaabbbbbb aaabbbcccbbbcccbbbccc aaa となってしまい、 欲しい結果とは違くなってしまいます。

  • VBAの正規表現

    VBAで正規表現による置換をしたいです。 以下のような行が複数あります。 1 aaa bbb ccc ddd 2 aaa bbb ccc ddd 3 aaa bbb ccce ddd 4 aaa bbb eccc ddd ccc の部分のみ置換したいです。 dim hensuu as string dim replace as string replace = eee hensuu = ccc (省略) strPattern = "(\s*)" & hensuu & "(\s+)" rep = RegExpObj.Replace(buf, "\1" & replace & "\2") 行数1,2 のみを置換したのですが、4も置換されてしまいます。 (\s*) の "*" が良くないのは理解していますが、"+" にしてもうまくいきません。 どなたかどのようにしたら1,2のみ置換できるようになるかをご教授お願いできませんでしょうか よろしくお願いいたします。

  • Access2007抽出のことで

    Access2007のクエリ、デザインビューのことです。 データが例えば aaa bbb ccc ddd とあるとして、このうちaaaとcccの2つを抽出しようと 思って「"aaa"and"ccc"」とか書いても データシートビューでは空欄になってしまいます。 条件の書き方がおかしいのでしょうか?

  • アクセスからのメール送信

    現状下記のプログラムでアクセスのレポートをメールで送っています。 ToとCCにあたるところですが時々変更になるのでできればフォーム上のテキストボックスから取得したいのですができるのでしょうか。 下記のaaa@bbb.comとccc@ddd.comのところをフォーム上のテキストボックスから取得したいのです。宜しくお願い致します。 DoCmd.SendObject acSendReport, _ "rptABC", _ "PDFFormat(*.pdf)", _ " aaa@bbb.com", _ " ccc@ddd.com", _ "", _ " ABC", _ "ABC"

  • エクセルのマクロについて質問です。

    下の表を展開したいです。    A   B   C  D  E  F  G 1 C102,C103,C104 aaa bbb ccc ddd~ 2 R102,R103,R105 YYY RRR EEE GGG~ 3 R106,R107,R108   空白(上と同じ) 4 空白 5 L102,L103,L105 QQQ MMM NNN BBB~ という表を、 1 C102 aaa bbb ccc ddd 2 C103 aaa bbb ccc ddd 3 C104 aaa bbb ccc ddd 4 R102 YYY RRR EEE GGG というように最後まで展開していきたいです。 下のマクロだとB列以降が全て一番上と同じ文字列がコピーされてしまいます。 よろしくお願いします。 Sub test2() Dim ax As String 'A列のセルに入っているテキストを代入するための変数 Dim ax2 As String 'axを統合したテキストを代入するための変数 Dim num As Integer, i As Integer '回数を代入するための変数 Dim arr As Variant '配列を格納 Dim tex As String 'B列以降の文字列を代入するための変数 'A列にいくつデータが入っているかを確かめ、その数をnumに代入 Range("A1").Select Selection.CurrentRegion.Select num = Selection.Rows.Count Range("A1").Select 'A1のテキストの最後にカンマが入っているかを判定。なければカンマをつける。 'A列のデータが入っている最後のセルまで上記の処理を行う。 '各テキストは変数axに代入、ax2で統合する For i = 1 To num ax = ActiveCell.Text If Right(ax, 1) = "," Then ax = ax Else ax = ax & "," End If If i = 1 Then ax2 = ax Else ax2 = ax2 & ax End If ActiveCell.Offset(1).Select Next i ax2 = Left(ax2, Len(ax2) - 1)  arr = Split(ax2, ",") Range("A1").Select For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i Range("A1").Select Selection.CurrentRegion.Select num = Selection.Rows.Count 'B~D列を展開 For i = 1 To 3 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub

  • ExcellVBA ForNextについて

    VBA勉強中の者です。 早速ですが、質問させて頂きます。 A1からC3に数値があります。 なるだけCellsプロパティを使用し、直接的なセルのアドレス指定をせずに A1+A1をA5、B1+B1をB5、C1+C1をC5、 A1+A2をA6、B1+B2をB6、C1+C2をC6、 A1+A3をA7、B1+B3をB7、C1+C3をC7、と返したいのです。 コードは以下の通りです。 Sub test() Dim rng1 As Range Dim aaa As Integer Dim i As Integer Dim bbb As Integer '------------------------- For aaa = 1 To 3 '------------------------- For bbb = 5 To 7 '------------------------- For i = 1 To 3 '------------------------- Set rng1 = Cells(aaa, i) Cells(bbb, i) = Cells(1, i) + rng1 MsgBox (Cells(1, i) + rng1) '------------------------- Next i '------------------------- Next bbb '------------------------- Next aaa '------------------------- End Sub 数値を返すセルを指定するコードが間違っていると思われ、 複数のセルに同じ数値を何度も返してしまいます。 数日間調べつつ改善しましたがどうしても解決できず、どなたかご助力お願い致します。

  • Excel_VBAで検索してデータ反映ができない

    Excel関数(vlookup)ではなく、VBAで以下内容のことを作成してみたのですが、うまく動きませんでした。 どこが問題なのか調べられないため、問題個所を教えていただけます様、お願いいたします。 ※Excel関数(vlookup)を使用しない理由は、検索行数が膨大で関数だと動きが重たくなるため。 お手数おかけしますが、ご教示のほど、お願いいたします。 【内容】 sheet2のB列の値をsheet1のC列へ反映したい。 なお、sheet1のA列には空白があっても空白行は飛ばして、次の行を検索・反映させる。 <sheet1> <sheet2>   A   B   C         A   B    1 AAA  3/2          1 AAA  大阪 2 BBB  6/7           2 BBB  兵庫 3 CCC  5/31          3 CCC  奈良 4 DDD 7/28          4 DDD  和歌山 5                5 EEE  京都 6 FFF  12/2         6 FFF  滋賀 【作成したVBA】 Sub kensaku() Dim search As String Dim i As Long Dim j As Long For j = 3 To 10 'jが3からSTEPしないのはなぜか? search = Cells(j, 2) For i = 2 To 11 For k = 3 To 12     If search = Worksheets("sheet2").Cells(i, 1) Then     Cells(k, 3) = Worksheets("sheet2").Cells(i, 2) End If Next Next Next End Sub

専門家に質問してみよう