トップページ⇒tech
876コメント334KB

Access使い集合! Ver2.0

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
前スレ
http://pc3.2ch.net/test/read.cgi/tech/1005078204/
0002デフォルトの名無しさんNGNG
というわけで、いきなり質問です

これからACCESSで開発をはじめようと思っています
フォームは非連結で行う個所があるので、
プログラム上でDB接続の記述をしないければいけないわけですが、
これからやるなら、ADOですよね?
DAOは過去の産物と聞きましたが・・・

皆様の参考意見を聞かせてほしいです。
0003デフォルトの名無しさんNGNG
好きにしろ。
0004デフォルトの名無しさんNGNG
おれは、ADO使いだ
0005デフォルトの名無しさんNGNG
どう考えてもADOに未来はないだろ。
北海道も余計なものに金使ってしまった。
0006デフォルトの名無しさんNGNG
>>5
何か面白いこと言ってるんだろうけど、
俺にはよく分からないな。
0007デフォルトの名無しさんNGNG
>>2
「行う個所があるので・・・」と書いてるから仕事なんだろうけど
そんな事じゃ先が思いやられるなあ(藁
二つ試してみて開発と配布の両面から自分で判断しなよ。
0008デフォルトの名無しさんNGNG
>>6
AirDoかなぁ?
0009デフォルトの名無しさんNGNG
>>1
で、ここは何のためのスレだ?厨房向け質問スレなのか?
それくらい書いとけよ、アホ
0010デフォルトの名無しさんNGNG
もともとは単発質問のクソスレだったんだがな・・・

>>2
「これからやるなら、ADO」は否定しないが、
ACCESSにはDAOこそが相応しいと漏れは思う。
00112NGNG
どうもです。
今回質問したのは、手持ちのVBA参考書には今後はADOと書いてあるのに、
いろんなスレではDAOも使ったほうが・・というのをチラホラ見たからです。
それでどちらを使えばいいのか迷ってしまって。

>>7
仕事です。まぁ、個人企業の社内システム担当者が社内向けに作るシステムというか。
設計から全部自分のみでやっています。
だから、「行う個所」、というか、「行おうと思っている個所」、が正しいですね。
前5年ほどいたソフト会社が、参考書に「ADOいい!」ってあれば、それ使えばいいや!
という会社で、現在もそのスタンスでやってるもので・・・・。
一応ADOで進めてますが、時間があればDAOも試してみます。

>>1
書いて無かったですね。すみません、
まぁ厨向けというか、初心者向け質問スレでいいのでは?

>>10
ありがとうございます。参考にします。
0012デフォルトの名無しさんNGNG
ADOよりDAOの方が良いと逝ってる香具師は
ADO使えないんだる
0013デフォルトの名無しさんNGNG
判断基準は 使える/使えない だけなんですか?
00147NGNG
>>11
小規模なLANを考えているなら、ADOがいいと思うよ。
データベース自身を他のもの(SQLServerとか、MYSQLとか)に変えたときでも
対応が楽。
スタンドアロンでワープロ文書みたいに使いたいならDAOのほうが
むしろ楽かもね。
0015デフォルトの名無しさんNGNG
ついでに、マルチユーザで使う計画があるならエンジンもMSDEを使っとけ。
0016デフォルトの名無しさんNGNG
あげ
0017デフォルトの名無しさんNGNG
age
0018デフォルトの名無しさんNGNG
>>DAO→初心者向け
>>ADO→(略

漏れは拡張性考えてADOだがな。
0019デフォルトの名無しさんNGNG
なんだ初心者向けって。
VBとVCを同じ土俵で勝負させてどっちが優れてる劣ってるって言ってる厨房と同レベルだ。
0020デフォルトの名無しさんNGNG
sqlで、insert文で日付を扱うときに
日付を#で囲まなければなりませんが、
日付をnullでinsertするときはどのように
したらいいのでしょうか?
0021デフォルトの名無しさんNGNG
>>20

> insertするときはどのように
> したらいいのでしょうか?

女の同意を得てからinsertする。(同意なしに強引にinsertすると、タイーホされる)

insertする前に、ちゃんと濡れさせておく。前戯なしにいきなりinsertするのは×

- 以上 -
0022デフォルトの名無しさんNGNG
ビジネスソフト板の「ACCESS総合相談所 その5」スレが無くなってるけど
どうなってんの?
0023デフォルトの名無しさんNGNG
>>22

> ビジネスソフト板の「ACCESS総合相談所 その5」スレが無くなってるけど
> どうなってんの?

削除依頼出すますた
0024デフォルトの名無しさんNGNG
え! なんでまた
暇な時いつも見てて自分の知り得る範囲なら
教えてやれてたのに。
0025デフォルトの名無しさんNGNG
嘘を嘘と(略
つぅかあるべよ
0026デフォルトの名無しさんNGNG
>20にマジレスしていいのかな・・・
Nullとは、「何も入れた事が無い」って事を表す値だって事はわかる?
0027デフォルトの名無しさんNGNG
ここも教えて君が集うスレになるの?
0028デフォルトの名無しさんNGNG
ACCESSのフォーム上であるような「住所を入れたらカナを勝手に入力」な機能(オートコレクト?)
をコード上で再現したいんですが、どうやったら可能なんでしょうか?

というのも今作ってるのはADP+MSDEなので、
オートコレクト機能がないのです;;

何かご存知の方、よろしくです

002920NGNG
>>26
Dim rs As New ADODB.Recordset
Dim sql as string

sql = "insert into DB1" _
& "(依頼番号, 依頼日)" _
& " values ('" & rs![依頼番号] & "' ,'" & rs![依頼日] & "' );"

のようにするとまず日付は
"#" & rs![依頼日] & "#" のようにして文字列で囲まないと
いけないですよね?
もしレコードに日付のデータが無かったときは
##とかになってエラーが起きるのでレコードに日付がないときは
nullをいれたいというか、フィールドになにもいれたくないんです。

if文やCase文でSQL文の場合わけをすれば解決するかも知れませんが、
日付のフィールドがたくさん合った場合に凄く面倒になるのでなるべ
く日付型のフィールドにnullをいれたいのです
0030デフォルトの名無しさんNGNG
>>27
>ここも教えて君が集うスレになるの?

スレ建ての主旨に沿うとそういうことになるなぁ
まぁ>>1が責任もって面倒みりゃいいんだが、逃げたもよう(w

# ム板にまで初心者向けスレはいらないと思う
0031デフォルトの名無しさんNGNG
>29
INSERTするのにSQLじゃなくRecordset使ってみるトカ。
0032デフォルトの名無しさんNGNG
>>31

性能下げてどーする。
0033デフォルトの名無しさんNGNG
あくまで一つの案よ。
今のところ、速度は問題になってないんだし。
0034デフォルトの名無しさんNGNG
>>29
判定文くらいかけるだろう?
0035デフォルトの名無しさんNGNG
あげ
0036デフォルトの名無しさんNGNG
Accessで作ったデータベースをJAVAで使いたいんですが
いちいちコントロールパネルのODBCで設定するのが
面倒なので自動でやる方法ってありませんか?
0037デフォルトの名無しさんNGNG
>>36 無い。市ね。
0038デフォルトの名無しさんNGNG
Accessで、Oracleのrowidのような機能ってありますか?
0039デフォルトの名無しさんNGNG
>>38
オートナンバー用意して主キーにしとくぐらいかな。

ま、mdbはユーザーが主キーの設定しなくても、内部で用意しちゃうけど。
それがROWIDと言えなくもない。
004038NGNG
>39
やっぱりそうですか。
別スレで紹介されていた、重複行を削除するSQL
delete from tbl a
where a.rowid > (
 select min(b.rowid)
 from tbl b
 where b.value = a.value
)
って奴をAccessでも使えないかなと思ったのですが。
今回はテーブルレイアウト変更不可という前提があるので無理ポですね。
残念。
0041デフォルトの名無しさんNGNG
顧客管理DBを作っているんですが、
個人マスタに会社コードと社員コードの項目があります。
で、社員コードは複数の会社でだぶってしまうことがあるので、
会社コードを社員コードの二つを主キーにしようかと思っているんですが、
二つを主キーにするのって、管理上いかがなものなんでしょうか?

それとも、別途会社コード+社員コードのフィールドを別途設けて
それの項目のみを主キーにしたほうがいいんでしょうか?

ACCESSというより、データベース管理的な質問になってしまいましたが、
詳しい方のアドバイスをヨロシクお願いします。
0042デフォルトの名無しさんNGNG
>>41
まぁ、データベースの入門書でも読みなされ。
0043デフォルトの名無しさんNGNG
>41にピッタシカンカンな所みっけ
ttp://www.mahoutsukaino.com/ac/ac97/basic/mainkey.htm
0044デフォルトの名無しさんNGNG
ACCESS2000を使っています。
ACCESSのレポートをそのままの表示で保存(データ化)したいんですが、
何か方法はありますか?

004544NGNG
すみません、エクスポートでリッチテキスト出力でできました。
お騒がせしました

ただ、サブレポートまで出力してくれない・・・(;´Д`)

0046デフォルトの名無しさんNGNG
AccessのVBAで処理時間をミリ秒まで計測したいのだけど、やり方教えて。
ちなみに環境はwindowsXP + Access2002

GetTickCount()を呼び出すらしいけど、Win32API使ったこと無い。

Access97 + Windows95で問題なく動いていたマクロがXP+2002になったとたん処理が激遅になったので・・
0047デフォルトの名無しさんNGNG
API名まで分かってるならいくらでも探せるだろうがハゲ。
ゲーム系のサイトでも当たって見ぃ。
0048デフォルトの名無しさんNGNG
解決しマスタ。失礼。
0049デフォルトの名無しさんNGNG
>>46
Timer関数じゃだめなのか?
0050デフォルトの名無しさんNGNG
adpで開発してます。
mdb時にはサブフォームを多様してたんですが、
先輩からあまりサブフォームは好ましくないと聞きました。

便利なのでadpでも使おうかなと思ってるんですけど、
あまり多様すると問題があるんでしょうか?
0051デフォルトの名無しさんNGNG
サブフォームよりも君の漢字能力に問題があると思うな。
005250NGNG
>>51
ああ、確かに漢字間違えてますね。失礼しました。
というかただの変換ミスだったんですけど。
0053デフォルトの名無しさんNGNG
同期がとりづらいとか、細かいところ手が届かないとかかな?
見出しをメイン、明細をサブとかあまりお勧めしない。使ってる人多いと思うけど。
つーか気にするならVBで作れよと思った。
0054デフォルトの名無しさんNGNG
>53とも被るが、別モジュールになるから保守が大変って事じゃないのか。
VBAロジックにコメントと共に書いてくれるならともかく、プロパティの設定だけで
ゴチャゴチャやられちゃうとメンテする人は地獄を見る可能性高し。
0055デフォルトの名無しさんNGNG
お助けください。Access2000でDAO使用です。
ExcelシートにAccessのクエリをエクスポートしたいのですが、
どうすればよろしいでしょうか。

最初は
DoCmd.TransferSpreadsheet acExport, , "クエリ名", FileName, True
でやろうとしていましたが、同じファイル名の同じシートが存在していると
オブジェクトがかち合ってしまいエクスポートできません。
で、CreateObjectを使ってExcelを操作し、
Excel側からAccessのクエリを参照する方法を探しているのですが…。
ご存知の方はいらっしゃいませんでしょうか。
0056デフォルトの名無しさんNGNG
>>55
どうしてファイル名を変えようとは思わないの?
0057デフォルトの名無しさんNGNG
Accessってフォーム上で
ドロップダウンリストボックス使えないんですね。
で、いろいろプロパティをいじって代用方法を考えてるんです。
コンボボックスで選択は出来るが
キー入力はできないようにするだけなんですけど…。
うーん。やっぱダメなのかな?
0058もまずにパピコNGNG
>>57
漏れはキー入力できないようにしたコンボボックス=ドロップダウンリストボックス
だと思ってた。違うのか?
005957NGNG
>>58
えーと、ヘルプによると正式な「ドロップダウンリストボックス」なるものは
データアクセスページにしか存在しないとのことです。

それで、キー入力できないようにするにはどうすればいいかと。
Locked/編集ロックをYesにすると選択が出来なくなってしまいますし。
テーブルをレコードソースとして用意し、コンボボックスで選択させ、
そして選択された文字列(textプロパティ)の値を変数に入れる。
というのをやりたいんです。

ものすごーく基本的なとこで躓いてるのはわかるんですが…。
未熟者にご教授くだされ。ちなみに、Access2000です。
0060もまずにパピコNGNG
>>59
やっぱり、コンボボックスを貼り付けてプロパティ変えたらリストボックスとして使えるハズ。
SourceTypeとか色々いじくってみて
006157NGNG
>>60
ご返事どうもです。
テーブルを直にレコードソースに指定するのではなく
RowSourceTypeを値リストにして、値集合ソースをいじる方向でやってみてるのですが…。
やはりキー入力を受け付けないようにするには何かが足りない…?
すみません、もう少しヒントを下さい。
0062ななしNGNG
Access2000で、カレントmdbファイル内にあるテーブルのフィールドが
オートナンバであるかどうかをチェックしようとしています。DAOを使用しています。

オートナンバーのフィールドのプロパティである
NewValuesプロパティ の Increment はどのようにしたら取得できるのでしょうか?

フィールドのプロパティで、NewValuesプロパティが取得できないので
Attributesプロパティ の、定数 16(dbAutoIncrField)でオートナンバかどうかが
判るかと思ったのですが、オートナンバのフィールドであっても違う値が返って来ます。

オートナンバのプロパティの取得方法について、どなたかお解りになる方
いらっしゃいませんか?
006362NGNG
ちなみに、下記のようにして確認しました。
-----------------------------------------------------------
Function test()
Dim db As DAO.Database, tbf As DAO.TableDef, fld As DAO.Field
Dim pro As DAO.Property, idx As DAO.Index
Set db = CurrentDb()
Set tbf = db.TableDefs("T_test")'1列目にオートナンバ型のフィールド有

'テーブルのフィールドを取得
For Each fld In tbf.Fields
Debug.Print fld.Name
Debug.Print fld.Type

'フィールドのプロパティを取得
For Each pro In fld.Properties
Debug.Print pro.Name
Debug.Print pro.Type
Next pro

'インデックスを取得
For Each idx In tbf.Indexes
Debug.Print idx.Name
Debug.Print idx.Unique
Next idx
Next fld

Set idx = Nothing:Set pro = Nothing
Set tbf = Nothing:Set db = Nothing
End Function
-----------------------------------------------------------
0064デフォルトの名無しさんNGNG
>>57

↓こんな感じでできる。

Public Const vbShiftMask        As Integer = 1   'キーコードマスク定数。
Public Const vbCtrlMask         As Integer = 2   '    〃

Public Sub cboKyDwn(ByRef KeyCode As Integer, _
          ByRef Shift As Integer, _
          Optional ByVal blnAlowDelete As Boolean = True)
  
  'blnAlowDelete引数が指定されている場合、[Delete],[BackSpace]による削除を禁止する。
  If Not blnAlowDelete And (KeyCode = vbKeyDelete Or KeyCode = vbKeyBack) Then
    KeyCode = 0
    Exit Sub
  End If

  'クリップボードへのCopyができるように。
  '[Ctrl]+[C], [Ctrl]+[Insert]
  If Shift And vbCtrlMask Then
    If (KeyCode = vbKeyC) Or (KeyCode = vbKeyInsert) Then Exit Sub
  End If
(改行が多過ぎてカキコできないwので、次の発言に続く)
0065デフォルトの名無しさんNGNG
>>64の続き

  '[↑][↓]、特殊キー以外のキーを入力させない。
  Select Case KeyCode
    Case vbKeyUp, _
       vbKeyDown, _
       vbKeyTab, _
       vbKeyEscape, _
       vbKeyReturn, _
       vbKeyF11, _
       vbKeyDelete, _
       vbKeyPrint, _
       vbKeyShift, _
       vbKeyBack, _
       vbKeyPageUp, _
       vbKeyPageDown, _
       vbKeyRight, _
       vbKeyLeft
    Case Else
      KeyCode = 0
  End Select
End Sub

注意点 :
(1) vbShiftMask、vbCtrlMask はVBにしかない定数。(Accessでも同等の機能を使うため、ユーザー定義)
(2) すべてのキーコードを無効化すると使い勝手が悪くなる。要求仕様に応じて、無効にするキーコードを
  適宜選択すること。
006657NGNG
>>64-65
大変ありがとうございます。
勉強させていただきます。
0067デフォルトの名無しさんNGNG
>>66
書き忘れたが、>>64のユーザー定義関数は、各コンボボックスの
ComboBox_KeyDown イベントから呼び出す必要がある。
サブクラス化やSendMessageが使用できれば、もっとエグイ技も
使えると思うが、残念ながらAccessのコントロールは、Window
ハンドルを隠蔽しているので、これはムリ。

- 以上 -

0068デフォルトの名無しさんNGNG
AccessVBAについての質問です。
データベース(mdb)が起動された時に
渡されたコマンドラインを取得するにはどうすればいいでしょうか?
また、起動されたファイル名の絶対パスを得るにはどうすればいいでしょうか?
ヘルプをあさったのですが、それらしい記述を見つけることができませんでした。
よろしくお願いします。
0069デフォルトの名無しさんNGNG

>>68

> 渡されたコマンドラインを取得するにはどうすればいいでしょうか?

Command を調べろ。

> また、起動されたファイル名の絶対パスを得るにはどうすればいいでしょうか?

CurrentDb().Name

> ヘルプをあさったのですが、それらしい記述を見つけることができませんでした。

努力不足。氏ね。
それから、バージョンもちゃんと書け。
007068NGNG
>69
ありがと。
参考になったよ。

>バージョンもちゃんと
バージョンにも依存するような関数なんだ。
へぇ。
0071デフォルトの名無しさんNGNG
↑!!!!!!!!!!!!!!!!!!!
0072デフォルトの名無しさんNGNG
Access2000のデザインビューで説明欄がありますが、
これをAccessVBAから取得することって可能でしょうか?
DaoのTableDefオブジェクトでは無理そうなので
他をあたっていますが見つかりません。
もし取れればテーブル定義ドキュメント楽に作れるんですが・・・
0073デフォルトの名無しさんNGNG
>>70
Ver2.0では 無理かも(w
0074デフォルトの名無しさんNGNG
>>72
http://www.ruriplus.com/msaccess/faq/faq_002.html
こちらのでどうですか?
0075デフォルトの名無しさんNGNG
ttp://www.h3.dion.ne.jp/~kakih/room5/ooo7.html
>なんと、Access2000のテーブルには、VBからアクセスできないのである

違うよね?
0076デフォルトの名無しさんNGNG
>>75
元記事ではODBCのみでしか接続できないとか書いてるが、
DAOもADOも使える。アホVB厨だろ
0077デフォルトの名無しさんNGNG
当時は出来なかったとか...?ンな訳無いか。
0078デフォルトの名無しさんNGNG
>>74
ありがとうです〜!おかげでできました。
これでドキュメントもラクチンです。
0079デフォルトの名無しさんNGNG
Dim wrkJet As Workspace
Dim dbsNorthwind As Database
Dim rstTemp As Recordset

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)

Set dbsNorthwind = wrkJet.OpenDatabase("C:\Documents and Settings\XXX\My Documents\幼稚園\YYY.mdb")
Set rstTemp = dbsNorthwind.OpenRecordset("テーブル", dbOpenDynaset, dbReadOnly)

  とHelpにあるままやったのですが、最後の行で型が違いますといわれます
  VBAから他のDatabaseのレコードセットを取得させたいのですが・・・
  他にも色々回避方法はあると思いますがこの形で取得できるやりかたをご教授願いマス
0080デフォルトの名無しさんNGNG
>>79

> 最後の行で型が違いますといわれます

Dim rstTemp As Recordset
↓
Dim rstTemp As Object
0081デフォルトの名無しさんNGNG
> 最後の行で型が違いますといわれます

Dim rstTemp As DAO.Recordset
と宣言するか、
または参照設定でDAOをADOより上位にする
008279NGNG
>80-81
ありがとうございます
もうちょっと考えればわかりそうなものですよね、思慮がたりませんでした
精進しマス
0083デフォルトの名無しさんNGNG
テーブルの最適幅をVBAで自動的に変更する方法おしえてください

DoCmd.OpenTable "テーブル名"
RunCommand acCmdColumnWidth

じゃできませんでした。
■ このスレッドは過去ログ倉庫に格納されています