Access VBA質問箱 IV

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

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


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

【8351】Re:再入力を防ぐには
回答  クロ  - 06/7/24(月) 17:23 -

引用なし
パスワード
   [Forms]![F_ModProgram]![ProgramName]の部分は
SQL文外に出しありますよね


strCriteria = strCriteria & strConn & "Program_Name = " & [Forms]![F_ModProgram]![ProgramName] & " "

この部分( [Forms]![F_ModProgram]![ProgramName])はテキストでも
SQL文上ではテキストだとわからないので明示的に
「' (シングルクォーテーション)」で括る必要があります。
[Forms]![F_ModProgram]![flgProgramID]は数値型ですので
とくに「' (シングルクォーテーション)」で括らなくとも大丈夫です。

strCriteria = strCriteria & strConn & "Program_Name = '" & [Forms]![F_ModProgram]![ProgramName] & "' "

としてみてはどうですか?
・ツリー全体表示

【8350】Re:再入力を防ぐには
質問  にしもり  - 06/7/24(月) 15:01 -

引用なし
パスワード
   先週から考えていますがよくわかりません。
わからない、というのは
たとえばフォームF_ModProgramのテキストボックスProgramNameに「aaa」といれると
テーブルをaaaで書き換えずに、次のようなダイアログボックスがでてしまうのです。
--------------------
| パラメーターの入力      
| aaa              
| ------------------    
|
| ------------------    
|               
| ---- ----------- 
| ok  キャンセル 
| ---- ----------- 
---------------------

SQL文は最終的には次のようになるとおもっております。
UPDATE tbl_TRAINING SET tbl_TRAINING.Program_Name = [Forms]![F_ModProgram]![ProgramName];
Program_NameとProgramNameは、ともにテキスト型です。
また、テキストボックスProgramNameでのイベントは次のようになっています。

Private Sub テキスト14_AfterUpdate()
  Me!DirtyFlg = 1
End Sub

なぜ、ダイアログボックスがでてしまうのでしょうか?
・ツリー全体表示

【8349】Re:クエリで合計をだすにはどうすればいい...
回答  Gin_II  - 06/7/24(月) 13:35 -

引用なし
パスワード
   >クエリB
>名称1  名称2  数量1  数量2  数量3 ・・・
>A     B    1     2    3
>C     D    4     5    6
>・
>・
>          5     7    9   →合計

一般的には、フォームやレポートを使います。
クエリでやりたい場合は、ユニオンクエリを使えば可能です。


> Excelのように

このような考え方だと、Accessを使うのは苦労します。
提示されているフィールド構成も、Access向きじゃないようですし・・・

Accessなら、
 名称1
 名称2
 区分
 数量
といったようなテーブル構成にした方がいいですね。
#名称1・名称2 の部分も変更したほうがいいのかも。

詳しくは、

[ACC2003] データベースの正規化の基礎
http://support.microsoft.com/kb/283878/ja

こちらを参照してください。
・ツリー全体表示

【8348】Re:クエリで合計をだすにはどうすればいい...
回答  たん  - 06/7/24(月) 13:29 -

引用なし
パスワード
   > Accessの環境にて、すべてのレコードに対して、Excelのように総合計
>(縦計)を集計したい場合は、どのように考えれば、集計可能になりますか?

どこでどう出したいのですか?

クエリ上なら、集計クエリで可能ですが、集計元のクエリと一緒のクエリ上に
出すには、さらにUNIONクエリにする必要があります。

# 集計クエリ及びUNIONクエリ上では、値の変更は出来ません。

フォームないしレポートなら、イベントで計算させるなり、
集計関数で出力する。

Excelのままと同じレベルを考えているなら、Excelで集計させた方がよいかも
しれません、
・ツリー全体表示

【8347】Re:サブフォーム
質問  ハジメ  - 06/7/24(月) 13:28 -

引用なし
パスワード
   ▼小僧 さん:
お世話かけています。
 コンパイルをして実行しましたが、結果は同じ現象でした。

>Refresh メソッドですと「#Deleted」というのが残ってしまいませんか?
>Requery だと大丈夫だと思うのですが…。
 Requeryにすると「#Deleted」が残りました。

>> このIF文の前にMSGBOXを試しに挿入すると、
>> 挿入したMSGBOXの行で同じく発生します。
  MSGBOX me!選択 と挿入しました。(説明洩れでした)

 取敢えず選択のところはコメントにして実行することにしました。
  Private Sub 選択_Exit(Cancel As Integer)
  '  If Nz(Me!選択) <> 1 Then
  '    Me!個数.TabStop = False
  '    Me!枚数.TabStop = False
  '  Else
  '    Me!個数.TabStop = True
  '    Me!枚数.TabStop = True
  '  End If   
  End Sub
そして、枚数を入力した時に入力値とデータの枚数が異なればその行の背景色を
変えるようにしたら、別の現象が出ました。
サブフォームの背景色の変更は条件付書式設定で行っています

  Private Sub 枚数_Exit(Cancel As Integer)
  
   Dim DB As DAO.Database
   Dim RS As DAO.Recordset    
   Dim MySQL As String 
   Set DB = CurrentDb
   MySQL = "select * from Q_荷札用合計データ where 出庫No. = " & Me!出庫No.
   Set RS = DB.OpenRecordset(MySQL)    
   If RS.RecordCount = 0 Then
    Cancel = True
   Else
    If (Me!枚数 <> RS!枚数) Then
      Me!選択 = "1"        '←この行の背景色を変えるため
    End If
   End If
'------最終行のチェック
    If Me.CurrentRecord = Me.Recordset.RecordCount Then
      Me.Parent.cmd印刷.Enabled = True
      Me.Parent.cmd印刷.SetFocus
    End If    
  End Sub
上記のようなコードで表示されている枚数と異なる枚数を入力するとカーソルは
移動せずに枚数のところで動きません。カーソルは表示されています。
ENTERキーを押下すると画面の下に「計算中」と一瞬表示されます。
つづいて、 
  '  If (Me!枚数 <> RS!枚数) Then
  ’    Me!選択 = "1"        '←この行の背景色を変えるため
  '  End If
コメントにすると上記のような現象は出ずに次行にカーソルは進みます。
以上のようなことですので、よいアドバイスをお願いします。
・ツリー全体表示

【8346】クエリで合計をだすにはどうすればいい?
質問  石井  - 06/7/24(月) 13:01 -

引用なし
パスワード
    Accessの環境にて、すべてのレコードに対して、Excelのように総合計
(縦計)を集計したい場合は、どのように考えれば、集計可能になりますか?

テーブルA
名称1  名称2  数量1  数量2  数量3 ・・・
A     B    1     2    3
C     D    4     5    6


クエリB
名称1  名称2  数量1  数量2  数量3 ・・・
A     B    1     2    3
C     D    4     5    6


          5     7    9   →合計
・ツリー全体表示

【8345】Re:複数条件の抽出について
回答  Gin_II  - 06/7/23(日) 22:16 -

引用なし
パスワード
   > 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。

この、Category1,Category2 ・・・ は、フィールド名じゃないということですね?


> For lngIdx = 1 To 6
>   If Not IsNull(Me("カテゴリ" & lngIdx)) Then
>     strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>         & Me("カテゴリ" & lngIdx) & "*'"
>   End If
> Next lngIdx

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

のように修正してみてください。


> もうひとつ疑問点なのですが、Mid(strWhere, 5)はどのような意味でしょうか?

ヘルプぐらいは確認しましょう。
それで分からなければ、再度質問してください。

Microsoft Office アシスタント: Mid 関数
http://office.microsoft.com/ja-jp/assistance/HP010432151041.aspx
・ツリー全体表示

【8344】Re:複数条件の抽出について
質問  こまったちゃん  - 06/7/23(日) 18:55 -

引用なし
パスワード
   ▼Gin_II さん:
ご指導本当にありがとうございます。
早速試してみたのですが、Categoryフィールド(データ元のテーブル)は固定で、テキストボックス1〜6に入力した値はすべて、Categoryフィールドを参照したいのですが、このVBAを実行するとCategory1,Category2と1〜6の数字が入ってしまい、構文エラーになってしまいます。
下のように変更をしてみましたがうまくいきません。
変数「IngIdx」をCategoryの後に付けなくても自動的に1〜6が入ってしまうのでしょうか?

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category Like '" & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx
もうひとつ疑問点なのですが、Mid(strWhere, 5)はどのような意味でしょうか?
If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
何度も申し訳ありません。


>>    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>                ~~~~~
>全角スペースになっていますが、半角スペース×2 にしてください。
・ツリー全体表示

【8343】Re:複数条件の抽出について
発言  Gin_II  - 06/7/23(日) 18:26 -

引用なし
パスワード
   >    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
                ~~~~~
全角スペースになっていますが、半角スペース×2 にしてください。
・ツリー全体表示

【8342】Re:複数条件の抽出について
回答  Gin_II  - 06/7/23(日) 18:24 -

引用なし
パスワード
   > SELECT 抽出フォーム用.[日付]
>    , 抽出フォーム用.[部 門]
>    , 抽出フォーム用.Category
> FROM 抽出フォーム用
> WHERE (((抽出フォーム用.日付) Between [Forms]![検索用]![日付From]
>                  And [Forms]![検索用]![日付To])
>  AND ((抽出フォーム用.[部 門]) Like [Forms]![検索用]![部門] & "*")
>  AND ((抽出フォーム用.Category) Like [Forms]![検索用]![カテゴリ1] & "*"));

このクエリの抽出条件をすべてはずしてください。
で、コマンドボタンを作成して、そのクリック時イベントで

Dim lngIdx As Long
Dim strWhere As String

If Not IsNull(Me!日付From) Then
  strWhere = strWhere & " AND 日付 >= #" & Me!日付From & "#"
End If

If Not IsNull(Me!日付To) Then
  strWhere = strWhere & " AND 日付 <= #" & Me!日付To & "#"
End If

If Not IsNull(Me!部門) Then
  strWhere = strWhere & " AND 部門 Like '" & Me!部門 & "*'"
End If

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
End If

のように記述してみてください。
・ツリー全体表示

【8341】Re:複数条件の抽出について
質問  こまったちゃん  - 06/7/23(日) 1:57 -

引用なし
パスワード
   ▼Gin_II さん:
ご指導ありがとうございます。
VBAはよく理解していない為、教えて頂いた文をどのように書いて良いか解りません。Webで「フォームFilter」で検索してみたのですが自分のやりたい文に置き換えることが出来ません。
申し訳ありませんが、全体の文か参考になるURLを教えていただけないでしょうか?
お手数をお掛けします。宜しくお願いします。


>> 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
>> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。
>> ただ、6つのうちいくつ指定するかはその都度違います。
>> あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを
>> 抽出していまします。
>> IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を
>> 書かなくてならないようで実用的ではありません。
>> どのようにSQL文を変えればうまく動作するでしょうか?
>
>フォームの Filter プロパティを使って抽出しては?
>
>Dim lngIdx As Long
>Dim strWhere As String
>
>For lngIdx = 1 To 6
>  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
>    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>        & Me("カテゴリ" & lngIdx) & "*'"
>  End If
>Next lngIdx
>
>If Len(strWhere) > 0 Then
>  Me.Filter = Mid(strWhere, 5)
>  Me.FilterOn = True
>End If
>
>とかのように。
・ツリー全体表示

【8340】Re:複数条件の抽出について
回答  Gin_II  - 06/7/22(土) 23:24 -

引用なし
パスワード
   > 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。
> ただ、6つのうちいくつ指定するかはその都度違います。
> あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを
> 抽出していまします。
> IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を
> 書かなくてならないようで実用的ではありません。
> どのようにSQL文を変えればうまく動作するでしょうか?

フォームの Filter プロパティを使って抽出しては?

Dim lngIdx As Long
Dim strWhere As String

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
End If

とかのように。
・ツリー全体表示

【8339】複数条件の抽出について
質問  こまったちゃん  - 06/7/22(土) 22:11 -

引用なし
パスワード
   ACCESSを始めたばかりで解らないところだらけです。宜しくお願いします。
今フォームから条件を入れてレコードの抽出をするツールを作っています。
クエリでしたら簡単に作成出来るのですがひとつ困った部分があります。

SELECT 抽出フォーム用.[日付], 抽出フォーム用.[部 門], 抽出フォーム用.Category
FROM 抽出フォーム用
WHERE (((抽出フォーム用.日付) Between [Forms]![検索用]![日付From] And [Forms]![検索用]![日付To]) AND ((抽出フォーム用.[部 門]) Like [Forms]![検索用]![部門] & "*") AND ((抽出フォーム用.Category) Like [Forms]![検索用]![カテゴリ1] & "*"));

上のSQL文で「Category」の抽出を「Category1」or「Category2」or「Category3」・・・と6つの条件指定をするように変えたいと思っています。
ただ、6つのうちいくつ指定するかはその都度違います。
あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを抽出していまします。
IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を書かなくてならないようで実用的ではありません。
どのようにSQL文を変えればうまく動作するでしょうか?
ご指導宜しくお願いします。
・ツリー全体表示

【8338】Re:サブフォーム
発言  小僧  - 06/7/21(金) 14:39 -

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

同じ様な環境を作って見たのですがこちらではなかなか再現しません…。


>Me.Refresh

Refresh メソッドですと「#Deleted」というのが残ってしまいませんか?
Requery だと大丈夫だと思うのですが…。

> DoCmd.SetWarning False
         ^^
> DoCmd.SetWarnings True

こちらはただの転記ミス、ですよね。

> このIF文の前にMSGBOXを試しに挿入すると、
> 挿入したMSGBOXの行で同じく発生します。

この辺が凄い怪しいのですが、
ツールバーの [デバッグ] → [xxxxのコンパイル] を実行して
コンパイルエラーは出ませんでしょうか。
(選択できない状態の場合、適当に改行をすると選べるようになります。)
・ツリー全体表示

【8337】Re:サブフォーム
質問  ハジメ  - 06/7/21(金) 13:57 -

引用なし
パスワード
   ▼小僧 さん:
早速の返信、ありがとうございます。
前回の件ですが、コードを書き直しをしている内にできまして、原因がわかりません
でした。どうも済みませんでした。

 今回の件ですが宜しくお願いします。
 Private Sub 選択_Exit(Cancel As Integer)
    If Nz(Me!選択) <> 1 Then
      Me!枚数.TabStop = False
    Else
      Me!枚数.TabStop = True
    End If   
  End Sub
クリアするタイミングはメインフォームでも発生しますし、サブフォームにカーソルが
ある場合でもコマンドボタンを押すと発生します。
発生するコードは
  If Nz(Me!選択) <> 1 Then
の行です。
このIF文の前にMSGBOXを試しに挿入すると、挿入したMSGBOXの行で同じく発生します。
また、選択の項目のイベントを削除すると現象は発生しません。
コントロール名を変更して実行しましたが、同じ現象です。
宜しくお願いします。
・ツリー全体表示

【8336】Re:再入力を防ぐには
発言  にしもり  - 06/7/21(金) 13:34 -

引用なし
パスワード
   ▼クロ さん:
>ProgramNameのデータ型を確認してください。
テキスト型です。


>そのためにはどうしたらよいか考えてください。
わかりました。やってみます。
・ツリー全体表示

【8335】Re:再入力を防ぐには
回答  クロ  - 06/7/21(金) 13:24 -

引用なし
パスワード
   ProgramNameのデータ型を確認してください。
たぶんテキスト型です。

そのためにはどうしたらよいか考えてください。
・ツリー全体表示

【8334】Re:再入力を防ぐには
質問  にしもり  - 06/7/21(金) 13:19 -

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

>どんなパラメータでしょうか?
「パラメータの入力」という名のダイアログボックスが出て文字を入れるよう要求してきます。

>この辺を見直してみては?
tbl_TRAININGのほうはProgram_Name、F_ModProgramのほうは ProgramNameとアンダスコアがありませんがその辺りでしょうか? 

お察しと思いますがこれは他者のつくったコードで、期せずして再利用することになりました。わたしは一からつくる実力がございませんので、アドバイスよろしくお願いいたします。
・ツリー全体表示

【8333】Re:再入力を防ぐには
回答  クロ  - 06/7/21(金) 13:03 -

引用なし
パスワード
   こんにちは

>パラメーターを聞いてきてしまい、また入力しなくてはいけません。

どんなパラメータでしょうか?

>      strCriteria = strCriteria & strConn & "Program_Name = " & [Forms]![F_ModProgram]![ProgramName] & " "

この辺を見直してみては?
・ツリー全体表示

【8332】再入力を防ぐには
質問  にしもり  - 06/7/21(金) 11:44 -

引用なし
パスワード
   こんにちは。

テーブルtbl_TRAININGと主フォームF_ModProgramとそのサブフォームSF_Programがあります。tbl_TRAININGの中は、Program_ID(オートナンバ型)、 Program_Name(テキスト)とします。主フォームにはサブフォームのほかにテキストボックスProgramName、flgProgramID、DirtyFlg、そして実行ボタンbtnExecuteがあるとします。サブフォームのレコードソースはtbl_TRAININGです。

サブフォームに表出されたtbl_TRAINING中のProgram_Nameを選択し、それを主フォーム上のテキストボックスProgramNameに入力された文字列で上書きしたいのです。下記までコードができていますが、テキストボックスに何か入れて実行すると、パラメーターを聞いてきてしまい、また入力しなくてはいけません。どこが悪くて聞いてきてしまうのでしょうか。どなたかアドバイスをお願いします。

Private Sub btnExecute_Click()
On Error GoTo ErrorHandler
  If DirtyFlg = 1 Then
    Dim strCriteria
    Dim strConn
    strCriteria = "UPDATE tbl_TRAINING SET "
    strConn = ""
    If IsNull(ProgramName) = False Then
      strCriteria = strCriteria & strConn & "Program_Name = " & [Forms]![F_ModProgram]![ProgramName] & " "
      strConn = ", "
    End If
      strCriteria = strCriteria & "WHERE Program_ID = " & [Forms]![F_ModProgram]![flgProgramID] & ";"
    DoCmd.RunSQL strCriteria
  Else
    MsgBox "No Need to Change"
    Exit Sub
  End If
  Me!DirtyFlg = 0
  Me!flgProgramID = Null
  Me!ProgramName = Null
  MsgBox "Update Completed"
Exit Sub

Private Sub ProgramName_AfterUpdate()
  Me!DirtyFlg = 1
End Sub

なおサブフォームのコードは以下のとおりです。

Private Sub Program_Click()
   Forms!F_ModProgram!flgProgramID = Me!Program_ID
   Forms!F_ModProgram!ProgramName.SetFocus
End Sub
・ツリー全体表示

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