Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


352 / 500 ページ ←次へ | 前へ→

【6170】Re:CreateIndexはステートメント
発言  たん  - 05/9/6(火) 14:33 -

引用なし
パスワード
   >ですが使用例が載ってなく

ちなみに、私のAC2000のヘルプでは、質問より「CREATE」で検索し、
「CREATE INDEX ステートメントの使用例」というのがきちんとあります。

また、CREATE INDEXステートメントからも使用例はすぐに見つかります。
(CREATE TABLEからも同じくみつかる筈です。)

上記のようにきちんと調べれば(例も含め)見つかるものに対して、
見つからないと言われるのは非常に残念です。

>このような思い込みのような記述はかなりショックを受けました。

キツイ言葉に取られたら申し訳ありません。
ただ、私は貴方がどこまで調べているのかは文面からは分かりませんし、
この文章は貴方だけが読むものではありません。

私の考えは、石鹸箱及び、この掲示板で数ページ前に記載していますので
読んでみて下さい。
・ツリー全体表示

【6169】Re:CreateIndexの例
回答  小僧  - 05/9/6(火) 14:16 -

引用なし
パスワード
   訂正版です。
ちょっとコード的には汚いですが…。


Sub テーブルの作成2()
'要参照設定 Microsoft DAO x.x Object Library
Dim MakeTBL As New DAO.TableDef
Dim Idx As DAO.INDEX
Dim TName As String

  TName = "T_Branch"

  If DCount("*", "MSysObjects", "Name = '" & TName & "'") > 0 Then _
    DoCmd.DeleteObject acTable, TName

  Set MakeTBL = CurrentDb.CreateTableDef(TName)

  With MakeTBL
    .Fields.Append .CreateField("Company", dbText)
    .Fields.Append .CreateField("Branch", dbText)
    .Fields.Append .CreateField("Post", dbText)
    .Fields.Append .CreateField("Address", dbText)
  End With
  
  Set Idx = MakeTBL.CreateIndex("Ind1")
    With Idx
      .Fields.Append .CreateField("Company")
      .Fields.Append .CreateField("Branch")
      .Primary = True
    End With
    MakeTBL.Indexes.Append Idx
    
  Set Idx = MakeTBL.CreateIndex("Ind2")
    Idx.Fields.Append Idx.CreateField("Company")
    MakeTBL.Indexes.Append Idx
  
  Set Idx = MakeTBL.CreateIndex("Ind3")
    Idx.Fields.Append Idx.CreateField("Branch")
    MakeTBL.Indexes.Append Idx
  
  MakeTBL.Indexes.Refresh
 
  CurrentDb.TableDefs.Append MakeTBL
  CurrentDb.TableDefs.Refresh

  Set MakeTBL = Nothing
  Set Idx = Nothing
End Sub

これで2つのフィールドを主キーに、
重複ありのインデックスが設定されると思います。
・ツリー全体表示

【6168】Re:CreateIndexはステートメント
質問  くま  - 05/9/6(火) 14:06 -

引用なし
パスワード
   ▼たん さん:
たんさん 返信をありがとうございます。

>というか、ヘルプ読んでます?
>きちんとヘルプを読みましょう。

はい。
ヘルプを読んでCreateIndexがあることを知りました。

>ヘルプには例もきちんと載ってます。

ですが使用例が載ってなく
何度も読み直したのですがどのように設定して使用するのか結局はヘルプの解読できず、こちらの方に質問させていただきました。

>CreateIndexはステートメントであり、メソッドではありません。
メソッドでないのにメソッドのような記述をしたのでエラーだったのですね。
ありがとうございます。


せっかく返信していただいたのに反論するようで申し訳ありませんが
ヘルプを見て、Access質問の検索をして、それでも記述が解らず自分で色々と試してからこちらに質問してみました。

こちらの状況が解らないにしても
このような思い込みのような記述はかなりショックを受けました。
># ネットにだけ頼って、きちんとそのネットで調べた結果をヘルプや
># 教本で裏付けしない状態で、鵜呑みにして使うから、こういう指摘を
># 受けるのです。

でも、ヘルプに記載がある事、メソッドで無い事等の
返信をありがとうございました。
もう少し他のサイトも検索を続けてみて私にも理解できる記載内容を探してみますね。
・ツリー全体表示

【6167】Re:CreateIndexの例
回答  小僧  - 05/9/6(火) 13:52 -

引用なし
パスワード
   ▼くま さん:
こんにちは。

Sub テーブルの作成()
'要参照設定 Microsoft DAO x.x Object Library
Dim MakeTBL As New DAO.TableDef
Dim Idx As DAO.INDEX
Dim TName As String

  TName = "T_Branch"

  If DCount("*", "MSysObjects", "Name = '" & TName & "'") > 0 Then _
    DoCmd.DeleteObject acTable, TName

  Set MakeTBL = CurrentDb.CreateTableDef(TName)
  Set Idx = MakeTBL.CreateIndex("INDEX")

  With MakeTBL
    .Fields.Append .CreateField("Company", dbText)
    .Fields.Append .CreateField("Branch", dbText)
    .Fields.Append .CreateField("Post", dbText)
    .Fields.Append .CreateField("Address", dbText)
  End With
  
  With Idx
    .Primary = True
    .Fields.Append .CreateField("Company")
    '.Fields.Append .CreateField("Branch")
  End With
 
  MakeTBL.Indexes.Append Idx
  MakeTBL.Indexes.Refresh
  
  CurrentDb.TableDefs.Append MakeTBL
  CurrentDb.TableDefs.Refresh

  Set MakeTBL = Nothing
  Set Idx = Nothing
End Sub

これで一つのフィールドに対してはできたのですが…。
コメントを外して主キーを2つにすると、何故かインデックスが外れてしまいます。
引き続き調査してみます。
・ツリー全体表示

【6166】Re:CreateIndexはステートメント
回答  たん  - 05/9/6(火) 13:29 -

引用なし
パスワード
   >T_Branchテーブルを作成し、CompanyとBranchにKeyIndexを付けたいのですが
>(テーブルを開いた時の鍵マークと重複有りのインデックス)
>私の文法が間違っているらしくエラーでこけます。

というか、ヘルプ読んでます?

CreateIndexはステートメントであり、メソッドではありません。
ので、CreateFieldなら構文は正解ですが、CreateIndexメソッドというものは
Accessの世界にありませんので、当然構文エラーです。

きちんとヘルプを読みましょう。

ヘルプには例もきちんと載ってます。

# ネットにだけ頼って、きちんとそのネットで調べた結果をヘルプや
# 教本で裏付けしない状態で、鵜呑みにして使うから、こういう指摘を
# 受けるのです。
・ツリー全体表示

【6165】VBAでのCreateIndex
質問  くま  - 05/9/6(火) 10:50 -

引用なし
パスワード
   新しいテーブルを作成し、T_Branch.csvのデータをセットします。
 項目名 "Company","Branch","Post","Address"
 データ "001","10001","1000001","東京都"
 データ "001","10002","1000002","東京都"
 データ "002","10003","1000003","東京都"
          :
T_Branchテーブルを作成し、CompanyとBranchにKeyIndexを付けたいのですが
(テーブルを開いた時の鍵マークと重複有りのインデックス)
私の文法が間違っているらしくエラーでこけます。

Set MakeTBL = CurrentDb.CreateTableDef("T_Branch")
With MakeTBL

 .Fields.Append .CreateIndex("Company", dbtext)  ⇒ここがCreateFieldならエラーは出ない
 .Fields.Append .CreateIndex("Branch", dbtext)  ⇒ここがCreateFieldならエラーは出ない
 .Fields.Append .CreateField("Post", dbtext)
 .Fields.Append .CreateField("Address", dbtext)
End with

CurrentDb.TableDefs.Append MakeTBL
Set MakeTBL = Nothing
CurrentDb.TableDefs.Refresh

全てCreateFieldで作成するとテーブルは出来ますが
重複Key不可や検索用のインデックスの設定が出来ていません。

どなたか私の間違いが理解できる方、ご指導願います。
・ツリー全体表示

【6164】Re:スペースの有無
発言  たん  - 05/9/6(火) 9:06 -

引用なし
パスワード
   ▼初心者の弱い猫 さん:
>確かに動きました!
>ありがとうございます。
>しかし、ビミョーなんですね。
>
>▼Gin_II さん:
>>半角スペースがないですね。

スペースの有無は大事です。ビミョーでもなんでもありません。

例えば「佐々木優」という名前の人がいるとします。

この方の姓は、「佐々木」ですか?「佐々」ですか?

人の名前の場合、スペースを置くことで姓と名を区別できます。

で、Accessではスペースを置くことで、各コマンドのパラメータ位置を
特定しているのです。

そして、今回の質問者のSQLには、スペースが無いので、SQL文が、
各パラメータを分けて認識できない。

それだけの事です。質問者がそれをビミョーと感じるのは自由ですが、
実際には、PCに仕事をさせるための決まりなのです。
・ツリー全体表示

【6163】Re:実行時エラー2108
お礼  ジュン  - 05/9/5(月) 18:47 -

引用なし
パスワード
   ▼たん さん:
>>ご指摘の通り BeforeUpdateで実行しました。AfterUpdateに変更できるか一度変更してみます。 ただ、何故、BeforeUpdateでは無理なのか教えて下さい。
>
>ヘルプに明記されていますが、
>
>-----
>BeforeUpdate コントロールまたはレコードで変更されたデータが更新される直前に発生します。
>-----
>
>データが更新されていない状態で、フォーカスを移動できないということです。
>データが更新されていない状態でフォーカスを移動させようとすると、現在表示されて
>いるデータは保存されていないにも関わらず、画面上には表示されているという不整合が

たんさん

ありがとうございました。解決しました。本当にありがとう御座いました。

>生じるからです。
>で、その不整合をなくす為にメッセージを出し、注意喚起していると。
>
>とはいえ、ヘルプに、注意書きで「BeforeUpdateでは、SetFocus等で他のコントロール
>には移動できません。エラーになります。」とか一言書けばいいのに、とは思うけどね。
・ツリー全体表示

【6162】Re:リストボックスの値の表示
お礼  ぷー  - 05/9/5(月) 15:58 -

引用なし
パスワード
   たんさん
ありがとうございます。
早速トライしてみます。
・ツリー全体表示

【6161】Re:リストボックスの値の表示
回答  たん  - 05/9/5(月) 15:33 -

引用なし
パスワード
   >リストボックス中に数字項目等の欄がありますが、すべて左詰めで表示されます。
>右詰めで見やすく表示する方法はないでしょうか?

http://www.accessclub.jp/samplefile/samplefile_119.htm

リストボックスの中のリスト表示は文字列管理されるので、基本は左詰めです。
リンクにあるように、空白をスペースで補うようにするしかありません。

ちなみに、スペースで埋めるので、選択されるデータも文字列になるので、
結果が数値で欲しいのであれば、数値変換しないとNGになる可能性があります。
・ツリー全体表示

【6160】リストボックスの値の表示
質問  ぷー  - 05/9/5(月) 15:06 -

引用なし
パスワード
   お久しぶりです。
いつも参考にさせていただいております、ありがとうございます。

リストボックス中に数字項目等の欄がありますが、すべて左詰めで表示されます。
右詰めで見やすく表示する方法はないでしょうか?
いつも初歩的な質問ばかりですみません。
よろしくお願いいたします。
(Access:2003 Os:Xp )
・ツリー全体表示

【6159】Re:実行時エラー2108
回答  たん  - 05/9/5(月) 10:39 -

引用なし
パスワード
   >ご指摘の通り BeforeUpdateで実行しました。AfterUpdateに変更できるか一度変更してみます。 ただ、何故、BeforeUpdateでは無理なのか教えて下さい。

ヘルプに明記されていますが、

-----
BeforeUpdate コントロールまたはレコードで変更されたデータが更新される直前に発生します。
-----

データが更新されていない状態で、フォーカスを移動できないということです。
データが更新されていない状態でフォーカスを移動させようとすると、現在表示されて
いるデータは保存されていないにも関わらず、画面上には表示されているという不整合が
生じるからです。
で、その不整合をなくす為にメッセージを出し、注意喚起していると。

とはいえ、ヘルプに、注意書きで「BeforeUpdateでは、SetFocus等で他のコントロール
には移動できません。エラーになります。」とか一言書けばいいのに、とは思うけどね。
・ツリー全体表示

【6158】Re:実行時エラー2108
お礼  ジュン  - 05/9/5(月) 9:26 -

引用なし
パスワード
   ▼たん さん:
>> 『”Gotocontrol”アクション ”GOTOCControlメソッド”またはSetFocusメソッド
>> を実行する前にフィールドを保存する必要があります』。
>> このエラーの意味と対処方法を教えてください。以下にコードを表示します。
>
>上記のコードの実行場所がBeforeUpdateであれば無理です。
>コード全体をAfterUpdateで行なうか、AfterUpdateでSetfocusを行なうように
>変更して下さい。
>
>(ちなみに全体のコードは見ていません。また、AfterUpdateに全体を写して良いか
> どうかについては、このイベントからだけでは、回答側は判断できません。)

たん さん、小僧さん ありがとう御座います。

ご指摘の通り BeforeUpdateで実行しました。AfterUpdateに変更できるか一度変更してみます。 ただ、何故、BeforeUpdateでは無理なのか教えて下さい。小生はACCESSの経験が浅くイベントの動きがもうひとつ理解できていません。お願いします。
・ツリー全体表示

【6157】Re:実行時エラー2108
発言  小僧  - 05/9/5(月) 9:01 -

引用なし
パスワード
   ▼ジュン さん、たん さん:
おはようございます。

エラーの理由は たん さんが記載されている通りなのですが、

>If IsNull(Me!得意先CD) Or IsEmpty(Me!得意先CD) Or Val(Me!得意先CD) = 0 Then

この部分について、「Null」値だった時は検証されましたでしょうか?
・ツリー全体表示

【6156】Re:実行時エラー2108
回答  たん  - 05/9/5(月) 8:30 -

引用なし
パスワード
   > 『”Gotocontrol”アクション ”GOTOCControlメソッド”またはSetFocusメソッド
> を実行する前にフィールドを保存する必要があります』。
> このエラーの意味と対処方法を教えてください。以下にコードを表示します。

上記のコードの実行場所がBeforeUpdateであれば無理です。
コード全体をAfterUpdateで行なうか、AfterUpdateでSetfocusを行なうように
変更して下さい。

(ちなみに全体のコードは見ていません。また、AfterUpdateに全体を写して良いか
 どうかについては、このイベントからだけでは、回答側は判断できません。)
・ツリー全体表示

【6155】Re:アクセスとエクセルファイルのリンク
回答  クロ  - 05/9/4(日) 9:07 -

引用なし
パスワード
   Accessのオブジェクトウィンドウのテーブルでリンクテーブルを
作られたことはありますか?
あれば同様にxlsファイルを指定してみれば出来るかと思います。

※ファイル選択時に出てこないなら下段の「ファイルの種類」で選
 択してあげてください。
・ツリー全体表示

【6154】アクセスとエクセルファイルのリンク
質問  まるちゃん。  - 05/9/4(日) 0:06 -

引用なし
パスワード
   アクセス初心者なのでとっても基本的なことかもしれませんが、
どなたか教えて頂けたら幸いですm(__)m。

エクセルのファイルとアクセスのファイルのリンク状態を保ちたいと
考えています。
(参考書でアタッチというのをみて、できるように思ったのですが・・・(>_<)。
エクセルで修正したものをそのままアクセスのファイルにも反映させたいのです。)

そういうことは可能なのでしょうか?

また可能な場合、そのエクセルのファイルをどのような方法で
アクセスに取り込む方法を教えていただけるでしょうか?

宜しくお願いいたしますm(__)m。
・ツリー全体表示

【6153】実行時エラー2108
質問  ジュン  - 05/9/3(土) 13:05 -

引用なし
パスワード
   得意先CDの入力チェックするフォームをテスト中にエラーコード2108が表示されました。 『”Gotocontrol”アクション ”GOTOCControlメソッド”またはSetFocusメソッドを実行する前にフィールドを保存する必要があります』。このエラーの意味と対処方法を教えてください。以下にコードを表示します。

エラーになった箇所は←印で表示しています。

If IsNull(Me!得意先CD) Or IsEmpty(Me!得意先CD) Or Val(Me!得意先CD) = 0 Then
  MsgRet = MsgBox("得意先CDを入力して下さい。", vbOKCancel, "入庫データ入力")
    Select Case MsgRet
        Case vbOK
          Cancel = True
        Case vbCancel
          Me!区分.SetFocus
        Case Else
    End Select
  Else
   If Len(Me!得意先CD) > 6 Then
     MsgRet = MsgBox("得意先CDは6桁以内で入力して下さい。",vbOKCancel, "入庫データ入力")
      Select Case MsgRet
          Case vbOK
            Cancel = True
          Case vbCancel
            Me!区分.SetFocus  ←ここでエラーが発生
          Case Else
      End Select
      Exit Sub
    End If
    
    Set DB = CurrentDb
    
    Sql = "Select * From T_得意先マスタ Where 得意先CD = '" & Me!得意先CD & "'"
    
    Set Rst = DB.OpenRecordset(Sql)
    If Rst.RecordCount = 0 Then
      MsgRet = MsgBox("得意先が未登録です。", vbOKCancel, "入庫データ入力")
      Select Case MsgRet
          Case vbOK
            Cancel = True
          Case vbCancel
            Me!区分.SetFocus ←ここでもエラーが発生
          Case Else
      End Select
    Else
      Me!得意先名 = Rst!得意先名
    End If
    
  End If
・ツリー全体表示

【6152】Re:テーブルの検索方法
回答  小僧  - 05/9/2(金) 16:48 -

引用なし
パスワード
   ▼masashi さん:
こんにちは。

>条件:20<=比較値<25

20 <= 比較値 <= 25 になってしまいますが、Between 関数はいかがでしょうか?

PARAMETERS [値1を入力] Value, [値2を入力] Value;
SELECT T_Temp.Model,
      T_Temp.A1,
      T_Temp.A2,
      T_Temp.A3,
      T_Temp.A4,
      T_Temp.A5
FROM T_Temp
WHERE T_Temp.A1 Between [値1を入力] And [値2を入力] 
   OR T_Temp.A2 Between [値1を入力] And [値2を入力]
   OR T_Temp.A3 Between [値1を入力] And [値2を入力]
   OR T_Temp.A4 Between [値1を入力] And [値2を入力]
   OR T_Temp.A5 Between [値1を入力] And [値2を入力];


「未満」であればこんな感じです。

PARAMETERS 以上 Value, 未満 Value;
SELECT T_Temp.Model,
      T_Temp.A1,
      T_Temp.A2,
      T_Temp.A3,
      T_Temp.A4,
      T_Temp.A5
FROM T_Temp
WHERE T_Temp.A1>=[以上] And T_Temp.A1<[未満]
   OR T_Temp.A2>=[以上] And T_Temp.A2<[未満]
   OR T_Temp.A3>=[以上] And T_Temp.A3<[未満]
   OR T_Temp.A4>=[以上] And T_Temp.A4<[未満]
   OR T_Temp.A5>=[以上] And T_Temp.A5<[未満];
・ツリー全体表示

【6151】Re:テーブルの検索方法
質問  masashi  - 05/9/2(金) 16:23 -

引用なし
パスワード
   ▼小僧 さん:
>▼masashi さん:
>おはようございます。
>
>>問い合わせ結果は、
>>Model  A1   A2   A3   ・・・
>>1    10   20   30
>>2    15   25   35
>>
>>よろしくお願いします。
>
>クエリのみで解決するのであれば、
>
>PARAMETERS [値を入力] Value;
>SELECT T_Temp.Model,
>    T_Temp.A1,
>    T_Temp.A2,
>    T_Temp.A3,
>    T_Temp.A4,
>    T_Temp.A5
>FROM T_Temp
>WHERE T_Temp.A1>[値を入力]
>    Or T_Temp.A2>[値を入力]
>    Or T_Temp.A3>[値を入力]
>    Or T_Temp.A4>[値を入力]
>    Or T_Temp.A5>[値を入力];
>
>こんな感じでしょうか。
ありがとうございます。うまくいきました。
仮に一つ値ではなく、二つの場合は、
条件:20<=比較値<25
どのように修正を加えれば、いいでしょうか?
ご伝授ください。
・ツリー全体表示

352 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1084717
(SS)C-BOARD v3.8 is Free