Access VBA質問箱 IV

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

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


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

【12562】Re:テキストボックスをダブルクリックで...
回答  かるびの  - 14/6/6(金) 0:48 -

引用なし
パスワード
    コードは自分で考えてみましょう。
 行き詰まったら、また質問してください。

 そうそう、If文で、AかつBをどう表現するかですが、例えば、
テキストボックスtxtNameとtxtCityがあるとして、
   If txtName.Value = "太郎" Then
    If txtCity.Value = "静岡市" then
      (実行させるコード)
    End If
   End If
とするか、
   If txtName.Value = "太郎" And txtCity.Value = "静岡市" then
     (実行させるコード)
   End If
とします。 
 いずれのコードも、
テキストボックスtxtNameの値が「太郎」、かつ、
テキストボックスtxtCiryの値が「静岡市」の場合に
「(実行させるコード)」が実行されます。
・ツリー全体表示

【12561】パススルークエリ(MySQL)を使って帳票フ...
質問  おーじん  - 14/6/5(木) 13:17 -

引用なし
パスワード
   現在、社内システムを構築中でMySQLへACCESSのパススルークエリのみで抽出、更新、削除処理を行っています。
その中で、Accessの帳票フォーム形式でレコードを追加、削除、更新ができないか試みてみました。しかし、パススルークエリからrecordsetをフォームにSETすると、更新不可のため困っております。

以下のような処理でqd.SQLを書き換えながら更新、削除、追加を行っております。
Dim qd As QueryDef

Set qd = CurrentDb.CreateQueryDef("")
qd.Connect = "ODBC;Driver={{Driver}};DATABASE={DBName};SERVER={SQLServer};PWD={PASS};PORT=3306;STMT=SETCHARACTER SET SJIS;UID={USERID}"
qd.ReturnsRecords = True

qd.sql = "select * from ほげテーブル;"
set me.Recordset=qd.OpenRecordset

実現したいのは、データシートのような一覧表を表示し、フォームOPENでSTART TRANSACTIONを行い、更新、追加、削除の処理後、COMMIT又はROLLBACKできるようにしたいのです。一覧表から個別に選択して、レコードを処理することも考えましたが、できれば一覧表上でできないかと思います。
よろしくお願いします。
・ツリー全体表示

【12560】Re:アクセスで違うカウント数を1度のクエ...
回答  hatena  - 14/6/4(水) 16:38 -

引用なし
パスワード
   サブクエリを使っていいのなら、

SELECT
T.cd_dealer,
Count(T.invoice) AS inv数,
Sum(T.pnoのカウント) AS ライン数
FROM
(SELECT
 cd_dealer, invoice, Count(pno) AS pnoのカウント
 FROM invoice
 GROUP BY cd_dealer, invoice) AS T
GROUP BY T.cd_dealer;
・ツリー全体表示

【12559】アクセスで違うカウント数を1度のクエリ...
質問  TON  - 14/6/4(水) 13:32 -

引用なし
パスワード
   下記のようなテーブルから、インボイスはDISTINCTの件数、ITEMはライン数でカウントを取引先毎にまとめたいのですが、1つのSQLにて可能でしょうか?

テーブルINVOICE
DATE    cd_dealer    invoice        pno
    A        A0001        X
    A        A0001        Y
    A        A0002        X
    B        B0001        X
    B        B0002        X


ほしい結果

取引先    インボイス数 ライン数
A    2        3
B    2        2

現状では、最初に取引先とインボイスでGROUP化してITEMをカウントしたクエリと
インボイスを取引先毎にGROUP化してDISTINCTカウントしたクエリを取引先で結合した
クエリにて取り出しています。

クエリ1
SELECT [invoice].[date],
    [invoice].[cd_dealer],
    [invoice].[invoice],
    Count([invoice].[pno]) AS pnoのカウント
FROM invoice
GROUP BY [invoice].[date],
     [invoice].[cd_dealer],
     [invoice].[invoice];


クエリ2
SELECT count(*) AS inv, dlcd
FROM  [SELECT distinct invoice,
        cd_dealer as dlcd        
    FROM invoice
    GROUP BY invoice,
         cd_dealer
               ]. AS T
GROUP BY dlcd;


クエリ3
SELECT n_inv.inv AS inv数,
    n_inv.dlcd,
    Sum(invoice_npn.pnoのカウント) AS ライン数
FROM n_inv INNER JOIN invoice_npn ON n_inv.dlcd = invoice_npn.cd_dealer
GROUP BY n_inv.inv, n_inv.dlcd;


よろしくお願いします。
・ツリー全体表示

【12558】Re:テキストボックスをダブルクリックで...
質問  ガッツだぜ!  - 14/6/4(水) 7:22 -

引用なし
パスワード
   かるびの さん、具体的にありがとうございます。
私、あまりVBAを自分で書いたことがないので、できましたら
具体的なコードを記していただければありがたいのですが。
よろしくお願いします。
・ツリー全体表示

【12557】Re:テキストボックスをダブルクリックで...
回答  かるびの  - 14/6/4(水) 1:34 -

引用なし
パスワード
    VBAのコードを書くことになります。
 なお、マクロでもできると思いますが、私は、マクロは使ったことがないので、
よくわかりません。でも、考え方は、VBAの場合と同じだと思います。

>「番号」テキストボックスをダブルクリックしたとき
の処理を自動化するわけですから、
「番号」テキストボックスのダブルクリックイベントにコードを書きます。

>1.「種別」テキストボックスが空欄の場合
>または、
>2.「番号」テキストボックスに既に数値が入っている場合
>は、ダブルクリックしても番号が振られないようにもしたいです。
 If文により場合分けしてあげればいいです。
 
 上記の条件からすると、
「番号」テキストボックスにVBAにより自動で値を入力するのは、
   「種別」テキストボックスが空欄でなく、
   かつ、「番号」テキストボックスに数値が入っていない場合
となりますね。
 
 「空欄」というのは、ちょっとだけ厄介です。
 一般に、空欄であるとは、テキストボックスの値がNullである場合、
又は長さ0の文字列が入力されている場合を言います。
 だから、「空欄でない」ということは、
   テキストボックスの値がNullでなく、
   かつ、値が「""」でもない場合
ということになります。
 
 それからNullであるとか、Nullでないとかは、
「値=Null」という式では判定できません。
IsNull関数を使う必要があります。

 「『番号』テキストボックスに既に数値が入っている場合」をどう考えるかですが、
最も単純にはIsNull関数を使うことになりますね。
 「番号」テキストボックスに文字列が入っていてはだめだ
ということを強調したければ、
IsNumeric関数を使って、「番号」テキストボックスに入力されている値が
数値として使える文字列かどうかを判定します。
 なお、テーブル1の「番号」フィールドが数値型であり、かつ、
「番号」テキストボックスが連結コントロールであれば、
そもそも「番号」テキストボックスには、文字列は入力できませんけどね。

>「みかん」の番号の最大値
は、DMax関数を使います。
 この関数の第3引数の書き方にはクセがあるので、注意してください。
 第3引数の書き方の基本は、「フィールド名=値」ですが、
「フィールド名」のフィールドがテキスト型の場合、値をダブルコーテーションで囲みます。
   フィールド名="太郎"
 そのフィールドが日付・時刻型の場合は、#で値を囲みます。
   フィールド名=#2014/06/03#
 そのフィールドが数値型の場合は、何も囲みません。
   フィールド名=234 

 以上をコード化するだけです。
・ツリー全体表示

【12556】Re:重複エラー表示!
お礼  ママ  - 14/6/3(火) 22:04 -

引用なし
パスワード
   >▼hatena さん:
>なるほど!自宅にはリーダーが無いので休み明けに
>早速試してみたいと思います
>vba初心者なのでまたアドバイスをお願いいたします。


本日、ためしたところ問題なく動きます。
ありがとう御座いました
・ツリー全体表示

【12555】テキストボックスをダブルクリックで自動...
質問  ガッツだぜ!  - 14/6/3(火) 21:54 -

引用なし
パスワード
   テーブル1が、

種別  番号
りんご  1
みかん  1
りんご  2
メロン  1
みかん  2
メロン  2
メロン  3

とあります。

フォーム1には、種別と番号のテキストボックスがあります。

新規データ入力で、「種別」テキストボックスに「みかん」と入力し、「番号」テキストボックスをダブルクリックしたとき、「みかん」の番号の最大値の次の番号「3」が自動的に振られるようにしたいのですが、どうしたらいいでしょうか。
なお、
1.「種別」テキストボックスが空欄の場合
または、
2.「番号」テキストボックスに既に数値が入っている場合
は、ダブルクリックしても番号が振られないようにもしたいです。
・ツリー全体表示

【12554】Re:重複エラー表示!
お礼  ママ  - 14/5/31(土) 21:04 -

引用なし
パスワード
   ▼hatena さん:
なるほど!自宅にはリーダーが無いので休み明けに
早速試してみたいと思います
vba初心者なのでまたアドバイスをお願いいたします。
・ツリー全体表示

【12553】Re:重複エラー表示!
回答  hatena  - 14/5/31(土) 16:52 -

引用なし
パスワード
   リーダーを使ったことがないので、あくまで脳内シミュレーションでの回答ですので、外している可能性大です。

>データの重複読み込みをさけるために手配番号を重複なしの主キーに
>設定してます

ということなら、フォームの「エラー時」イベントで重複エラーをひろってメッセージを出したらどうでしょうか。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  Const conDuplicateKey = 3022

  If DataErr = conDuplicateKey Then
    Response = acDataErrContinue
    Me.手配コード.SetFocus
    Beep
    MsgBox "既存のデータと同じ手配コードが入力されました! " & _
    "別の値を入力してください。", _
    vbOKOnly + vbExclamation, "重複エラー"
  End If
End Sub


これなら、Enterキーが押されて、レコード保存しようとするときに発生しますので、Msgboxは閉じないと思います。
・ツリー全体表示

【12552】重複エラー表示!
質問  ママ  - 14/5/31(土) 0:05 -

引用なし
パスワード
   何時も参考にさせていただいています。

手配データをqrコード化してフォームにリーダーを使って
読み込みをしています
データの重複読み込みをさけるために手配番号を重複なしの主キーに
設定してますvbaの 更新前処理(BeforeUpdate)イベントでif文にDcountを使い
重複読み込みがされたらエラー表示を出すようにコードを記述しました。
重複読み込みがあると問題なくマクロは動くようで、手配番号フィールドで止まります
ただ、警告メッセージは一瞬パット表示されるのですが、すぐに消えてしまいます。再度フィールドをclickする再
表示はされるのですが、できれば、読み込みをし重複があったら警告メッセージを表示させ消えないようにすることは、出来ないのでしょうか?
qrコードは複数のデータを読み込みさせフィールドとフィールドはタブ(キャラ)で
移動させ最後は改行(キャラ)で次の行に行くようにqrを作っています
多分警告メッセージが表示されもqrの多分が読み込まれて警告メッセージのOKボタンが押されしまうのではないかと思っています いい方法が有りましたらアドバイスお願いいたします。
コードはこんな感じで書いてあります

Private Sub 顧客コード_BeforeUpdate(Cancel As Integer)

If DCount("手配コード", "手配マスタ", _ "手配コード='" & Me!手配コード & "'") > 0 Then Beep MsgBox "既存のデータと同じ手配コードが入力されました! " & _ "別の値を入力してください。", _ vbOKOnly + vbExclamation, "重複エラー" Cancel = True End If

End Sub
・ツリー全体表示

【12551】Re:AccessSQLでROLLUPを使いたい
回答  hatena  - 14/5/28(水) 16:24 -

引用なし
パスワード
   >クエリで「小計」を出力したいと思い、SQLのROLLUPを使えば
>いいと聞いたので下記SQLを書きましたが上手く出来ません。
>
>SELECT uriage.コード,uriage.担当名,uriage.県名,Sum(uriage.金額) AS 金額の合計
>FROM uriage
>GROUP BY ROLLUP(uriage.コード,uriage.担当名,uriage.県名)
>
>エラーで「式に未定義関数 ROLLUP があります
>
>とメッセージが表示されます。

AccessのSQLはROLLUPには対応してません。

代替案ですが、ユニオンクエリで集計クエリと連結すればどうでしょうか。


SELECT uriage.コード, uriage.担当名, uriage.県名, "" AS 項目, uriage.金額
FROM uriage
UNION ALL
SELECT uriage.コード, Null, Null, "合計" AS 項目, Sum(uriage.金額)
FROM uriage
GROUP BY uriage.コード, Null, Null, "合計"
ORDER BY uriage.コード, 項目;
・ツリー全体表示

【12550】AccessSQLでROLLUPを使いたい
質問  hor-oku  - 14/5/23(金) 13:41 -

引用なし
パスワード
   Win7Pro+Access2013を使用しています。

クエリで「小計」を出力したいと思い、SQLのROLLUPを使えば
いいと聞いたので下記SQLを書きましたが上手く出来ません。

SELECT uriage.コード,uriage.担当名,uriage.県名,Sum(uriage.金額) AS 金額の合計
FROM uriage
GROUP BY ROLLUP(uriage.コード,uriage.担当名,uriage.県名)

エラーで「式に未定義関数 ROLLUP があります

とメッセージが表示されます。

どなたか解る方おられましたらご教授ください。
よろしくお願いします。

元データ
コード 担当名 県名 金額
1   AAA  ZZZ  100
1   AAA  YYY  100
2   BBB  XXX  200


出したい実行結果
コード 担当名 県名 金額
1   AAA  ZZZ  100
1   AAA  YYY  100
          200
2   BBB  XXX  200
・ツリー全体表示

【12549】Re:7行レポート作成について(初心者です...
お礼  asahi  - 14/5/21(水) 14:29 -

引用なし
パスワード
   わかりました。

検索してみます!
お手数をお掛けしますが、よろしくお願いします。
・ツリー全体表示

【12548】Re:7行レポート作成について(初心者です...
回答  hatena  - 14/5/21(水) 14:09 -

引用なし
パスワード
   >レポートは
>ページヘッター
>売上IDヘッダー
>売上明細IDヘッター
>詳細
>売上IDフッター
>ページフッター
>となっています。
>
>売上テーブルの主キーは売上IDで
>売上明細テーブルの主キーは売上明細IDとなっています。
>
>改ページ、売上IDフッターがカレントセクションの後になっていましたので
>いいえに設定しました。

文章だけでは、状況の把握は難しいですね。
実物をみないと、どこで間違っている指摘するのは難しそうです。
もし、よければ私の主催する掲示板が有りますが、
そちらならファイルをアップロードできますので、そちらで再質問してもらえますか。

「hatena の Microsoft Access 掲示板」をキーワードに検索すると見つかります。
・ツリー全体表示

【12547】Re:7行レポート作成について(初心者です...
質問  asahi  - 14/5/21(水) 13:18 -

引用なし
パスワード
   返信ありがとうございます。

AccessのバージョンはAccess2000です。

レポートは
ページヘッター
売上IDヘッダー
売上明細IDヘッター
詳細
売上IDフッター
ページフッター
となっています。

売上テーブルの主キーは売上IDで
売上明細テーブルの主キーは売上明細IDとなっています。

改ページ、売上IDフッターがカレントセクションの後になっていましたので
いいえに設定しました。

よろしくお願いします。
・ツリー全体表示

【12546】Re:7行レポート作成について(初心者です...
回答  hatena  - 14/5/19(月) 17:46 -

引用なし
パスワード
   とりあえず、ご使用のAccessのバージョンをお知らせください。
バージョンによって設定が異なる場合がありますので。

>すみません。勉強不足で売上IDと連結したテキストボックスというのがよくわかりません。

コントロールソースが、売上ID となっているテキストボックスがレポート上にありますか、という意味です。
これが、ないとVBA上から 売上ID を参照できません。

> ただ、7行以降改ページにしたいのですが、
> 『フィールドがない場合も用紙の最後まで罫線を出力する』
> で記載の通り記述すると、1行づつの明細になり8行明細があると8枚印刷されてしまいます。

グループ化の設定、または、セクションの改ページの設定がおかしいのだと思います。

売上テーブル の主キーでグループ化してますか。それが一番上になってますか。
このグループヘッダーの高さをヘッダー部の高さにします。

その下に、売上明細テーブルの主キー(売上明細ID かな?)でグループ化して、グループヘッダーを表示させます。
この高さに1行分の高さにします。

各セクションの「改ページ」はとりあえず「しない」に設定してください。
・ツリー全体表示

【12545】Re:7行レポート作成について(初心者です...
質問  asahi  - 14/5/19(月) 16:58 -

引用なし
パスワード
   サンプルファイルを見させていただきましたら、グループ化3行目に売上明細ID
をつくる方法があるのがわかりました。
ありがとうございます。

ただ、7行以降改ページにしたいのですが、
『フィールドがない場合も用紙の最後まで罫線を出力する』
で記載の通り記述すると、1行づつの明細になり8行明細があると8枚印刷されてしまいます。

Option Compare Database
Option Explicit
Dim RowCnt As Long

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)

 Me.MoveLayout = False
 RowCnt = 0
 
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

RowCnt = RowCnt + 1

  If RowCnt >= 7 Then '1ページ当たり7件
  

    Me.詳細.ForceNewPage = 2 'カレントセクションの後で改ページ

  Else

    Me.詳細.ForceNewPage = 0 'カレントセクションの前で改ページ

  End If

End Sub

たびたびすみませんがよろしくお願いします。
・ツリー全体表示

【12544】Re:7行レポート作成について(初心者です...
質問  asahi  - 14/5/19(月) 15:49 -

引用なし
パスワード
    >売上ID と連結したテキストボックスがレポート上にありますか。

すみません。勉強不足で売上IDと連結したテキストボックスというのがよくわかりません。
ただ、VBAのほうをSelect Caseに変えてみるとエラー出ずに動きました!が、8行入力すると7行目以降が印字されません。サブレポートがあるためなんですね。

明細を持つ伝票とその複写を同じページに2分割して表示する。
を見せていただいて、少しずつ進めているのですが、
『明細テーブルの主キーフィールドでグループ化して・・・』
のところで詰まっています。

レポートは『伝票作成クエリ』を作って伝票を印刷するようにしています。

内容は 
テーブル/クエリ・フィールド名
売上テーブル・得意先ID    
売上テーブル・運搬者ID        
売上テーブル・売上日付    
売上テーブル・備考    
売上テーブル・支払ID    
売上テーブル・社員ID    
売上明細クエリ・商品ID    
売上明細クエリ・数量    
売上明細クエリ・単位    
売上明細クエリ・単価    
売上明細クエリ・重量    
売上テーブル・売上ID
運搬者テーブル・車番
売上明細クエリ・売上明細ID

となっています。
ヘッダー項目のキーフィールドでのグループ化は、
売上IDと売上明細IDで大丈夫でしょうか??

明細テーブル主キーフィールドの売上明細IDは、ヘッダー項目のほうで
グループ化しているので売上IDと売上明細IDが出てきてしまいます。

すみませんがアドバイスお願いします。


・ツリー全体表示

【12543】Re:7行レポート作成について(初心者です...
回答  hatena  - 14/5/17(土) 13:09 -

引用なし
パスワード
   最初の質問より
> 下記のように7行以内なら7行と認識させ7行以上あれば8行目からは次の
> ページへ印刷されるようにするようにしたいのですが、

この部分を見落としてましたが、複数ページになるなら、サプレポート方式はあきらめましょう。
サブレポートでは改ページできないので、対応できるのは1ページの場合(7レコードまで)だけです。

ソースのデータにページ情報を持たせれば、メインレポートをページでグループ化して、それとリンクするサプレポートを配置するという方法も可能ですが、逆に複雑になりそうです。

それよりは前回紹介した方法が一つのレポートで済みますので楽のように思います。
前回の方法は2分割ですが、理屈が理解できれば、3分割にすることも可能ですし、複数ページでも対応してます。


> >"売上ID=" & Me!売上ID
> としたのですが、指定した式には値がありません。となります。
> データ型は、オートナンバー型の長整数型です。

売上ID と連結したテキストボックスがレポート上にありますか。
・ツリー全体表示

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