Access VBA質問箱 IV

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

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


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

【13129】Re:ACCESS2010のVBA64ビットについて
発言  亀マスター  - 16/12/9(金) 21:42 -

引用なし
パスワード
   手元に64bit版のOfficeがないのでなんとも言えませんが、32bit版のExcel 2013とAccess 2013で試したところ、ちゃんと機能しましたね。

ところで、この現象の原因とは関係ないかもしれませんが、このコードでは文字列と数値の区別がついていないようで、不具合が出そうだなという印象を持ちました。

AAAは数値を入れるのだと思いますが、Left関数の第1引数は文字列です。AAAの上位2桁を抽出したいということであれば、数学的に計算するのが適切かと思います。(IDなどで文字列として扱うものだとしたらすみません)

あと、Select Caseで"01" To "50"のような書き方をしていますが、これは数字として1〜50の範囲を指定するのだとしたら不適切です。
この書き方では数字としての意味は一切なく、文字列として辞書的配列に従って判断されることになります。
今回はLeft関数で2文字を引っ張ってるので問題にならないでしょうが、もし6〜9の数字を1桁表記にしたものを指定したら、1〜50ではなく51〜99の方に該当していまいますよ。
・ツリー全体表示

【13128】ACCESS2010のVBA64ビットについて
質問  pesan  - 16/12/8(木) 22:12 -

引用なし
パスワード
   32ビットのACCESS2010で作成したアプリケーションを64ビットのACCESS2010で動かすと想定した結果が返ってきません。

VBAスクリプトの抜粋です。

(渡した引数の上位2桁を判断させ、条件によって文字列の編集をする処理です)
--------------------------------------------------------------
Private Function syori1(AAA) As String
Select Case Left(AAA, 2)
 Case "01" To "50": syori1 = "111" & AAA
 Case "51" To "99": syori1 = "222" & AAA
 Case Else: syori1 = ""
End Select
End Function
--------------------------------------------------------------
AAAには「6060」が入っているとします。(AAAの値は確認しました)
32ビットでは、戻りが、「2226060」になりますが、64ビットだと「」(Elseに分岐します)になります。
32ビットと同じ結果を返すにはどういった対応が必要になりますか?

いろいろと調べてみたのですが、解決できなかったので
よろしくお願いします。
・ツリー全体表示

【13127】Re:複数表示の仕方について
回答  nao  - 16/12/7(水) 15:02 -

引用なし
パスワード
   更新クエリにて解決しました。
・ツリー全体表示

【13126】Re:数量が2つならレコードをコピー
回答  hatena  - 16/12/6(火) 17:57 -

引用なし
パスワード
   商品数分のラベルを作成したいということなら、クエリでいいでしょう。
ただし、クエリだと更新できませんので、台帳として使用して、
他にもフィールドがあり入力する必用があるならテーブルにする必用がありますね。

その場合、現状のテーブル「テーブル1」自体を書き換えるという方法と、
別に台帳用のテーブルを用意してそこに追加していくという方法が考えられます。

使用方法によって最適な方法は変わってきますのでよく検討してみてください。

とりあえず、現状のテーブルを書き換える場合のコードを例示しておきます。


テーブル1
ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1



ID フィールド1 数量
1  データ1    1
1  データ1   1
2  データ2    1
2  データ2   1
2  データ2   1
3  データ3   1

に変換Public Function AutoNew()

  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim rsA As DAO.Recordset
  Dim c As Long, i As Long

  Set db = CurrentDb
  Set rs = db.OpenRecordset("SELECT * FROM テーブル1 WHERE 数量>1;", dbOpenDynaset)
  Set rsA = db.OpenRecordset("テーブル1", dbOpenTable, dbAppendOnly) '追加のみ許可

  Do Until rs.EOF
    c = rs!数量 - 1
    rs.Edit
    rs!数量 = 1
    rs.Update
    For i = 1 To c
      rsA.AddNew
      rsA!ID = rs!ID
      rsA!フィールド1 = rs!フィールド1
      rsA!数量 = rs!数量
      rsA.Update
    Next
    rs.MoveNext
  Loop

  rs.Close: Set rs = Nothing
  rsA.Close: Set rsA = Nothing
  db.Close: Set db = Nothing

End Function
・ツリー全体表示

【13125】Re:DBの形式の違い
お礼  オスマン  - 16/12/6(火) 11:22 -

引用なし
パスワード
   亀マスターさま

ご指摘いただいた内容を確認してみると
やはり罫線関係の表記やVBAによるものでした。
ありがとうございました。
・ツリー全体表示

【13124】Re:数量が2つならレコードをコピー
発言  まき  - 16/12/5(月) 12:14 -

引用なし
パスワード
   ▼hatena さま

書き忘れました
概ねhatena様のご回答通りのことがしたいのですが、一点追加がありまして、

テーブル1

ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1

欲しい出力結果

ID フィールド1 数量
1  データ1    1
1  データ1   1
2  データ2    1
2  データ2   1
2  データ2   1
3  データ3   1

と言うように、数量を入れたいです
(数量はすはすべて1)
宜しくお願いします
・ツリー全体表示

【13123】複数表示の仕方について
質問  nao  - 16/12/5(月) 10:01 -

引用なし
パスワード
   お世話になります。
アクセスのクエリでカンマ区切りの複数数値の場合にテーブルから複数の値をもってくる方法についてご教示ください。

データのほうに、IDが1つであればもってこれるのですが複数になると持ってこれません。

データ:1,3,8となっている場合、保有資格テーブルから保有1,保有3,保有8という風にクエリで持ってきたいです。

説明のしかたが悪くてすいません。
どなたかご教示お願いします。
・ツリー全体表示

【13122】Re:数量が2つならレコードをコピー
発言  まき  - 16/12/5(月) 8:19 -

引用なし
パスワード
   hatena様

ご回答ありがとうございます

やりたいことはhatenaさまのおっしゃる通りです
数量分レコードをづくりたいです
最終目的はラベルと台帳です
商品1 3個なら

商品1 1
商品1 1
商品1 1

としたいです

クエリで出来るのですか?
・ツリー全体表示

【13121】Re:数量が2つならレコードをコピー
回答  hatena  - 16/12/3(土) 16:51 -

引用なし
パスワード
   ▼まき さん:
>テーブルAで数量が2だったら、同じレコードをコピーして同じテーブルに新しく追加するということをやりたくてコードを書きました所、
>
>ループが終わりません
>
>よく考えたらデータをどんどん追加するんだからいつまでたっても終わりませんよね(笑)
>
>テーブルに追加する前の一番最初のレコード数分だけ終わったらループが終わるようにしたいんですが
>
>どのようにすればよろしいでしょうか?

やりたいことが分かりません。
もう少し分かるように書き直してください。
最終目的を書いたほうがいいかも。

下記のようなことがしたいのかな。

テーブルに下記のようなデータがある。

テーブル1

ID フィールド1 数量
1 データ1 2
2 データ2 3
3 データ3 1

それから、下記のような出力結果が欲しい。

ID フィールド1
1  データ1
1  データ1
2  データ2
2  データ2
2  データ2
3  データ3


最終目的
商品の数量分のラベルを印刷したい。

ちがうなら、上記のような感じで具体例を出して説明してもらうとやりたいことが伝わりやすいですね。
最終目的も書いてくださいね。

上記の場合なら、クエリだけで希望の結果を出すことができます。
(VBAでテーブルを書き換えちゃうと後々面倒ですからね。)
・ツリー全体表示

【13120】数量が2つならレコードをコピー
質問  まき  - 16/12/1(木) 19:41 -

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

いつもお世話になります

access DAOについて質問です

よろしくお願

テーブルAで数量が2だったら、同じレコードをコピーして同じテーブルに新しく追加するということをやりたくてコードを書きました所、

ループが終わりません

よく考えたらデータをどんどん追加するんだからいつまでたっても終わりませんよね(笑)

テーブルに追加する前の一番最初のレコード数分だけ終わったらループが終わるようにしたいんですが

どのようにすればよろしいでしょうか?


Public Function AutoNew()

Dim db As DAO.Database

Dim Data1, Data2, Data3, Data4, Data5, Data6, Data7

Set db = CurrentDb
Dim rs As DAO.Recordset

Set rs = db.OpenRecordset("テーブルA")

Do Until rs.EOF

rs.Edit


If rs!数量 > 1 Then


Data1 = rs!フィールド1

Data2 = rs!フィールド2

Data3 = rs!フィールド3

Data4 = rs!フィールド4

Data5 = rs!フィールド5

Data6 = rs!フィールド6


rs.AddNew


rs!フィールド1 = Data1

rs!フィールド2 = Data2

rs!フィールド3 = Data3

rs!フィールド4 = Data4

rs!フィールド5 = Data5

rs!フィールド6 = Data6


End If


rs.Update

rs.MoveNext

Loop

rs.Close

Set rs = Nothing

db.Close

Set db = Nothing

End Function
・ツリー全体表示

【13119】Re:DBの形式の違い
回答  亀マスター  - 16/11/29(火) 20:06 -

引用なし
パスワード
   >右下に「ページをフォーマットしています」という表示と緑色が右向きに進むステータスバー?がずっと表示されたまま応答なしになります。

レポートのページフォーマット時のイベントに何かプログラムを入れているのでしょうか。もしかすると、そのプログラムでバグが発生しているのかもしれません。Officeでは前のバージョンで問題なかったのに後のバージョンで不具合が出るということもありますので。

ひょっとしてこれと同じ現象でしょうか。
「Access2007の罫線設定のあるレポートが表示されません。」
ht tp://okwave.jp/qa/q5300562.html

どうしても上手くいかないようであれば、新規のデータベースファイルを作成し、手動でフォームやレポートとデータをコピーしてみてください。
・ツリー全体表示

【13118】Re:DBの形式の違い
質問  オスマン  - 16/11/29(火) 8:34 -

引用なし
パスワード
   亀マスターさま

元のmdbファイルをコピーしてaccdbに保存してやっています。
どのように遅いかというとレポートを印刷プレビューで開いたときに
右下に「ページをフォーマットしています」という表示と緑色が右向きに進むステータスバー?がずっと表示されたまま応答なしになります。
2003で作成し2003で開くとほんの数秒です。
ページ数としては200ページ程度となります。
2003からしてみれば軽い動作も2010から見れば重く複雑な扱いになっているのでしょうか?
・ツリー全体表示

【13117】Re:DBの形式の違い
回答  亀マスター  - 16/11/28(月) 18:53 -

引用なし
パスワード
   >ACCESS2003で作成したレポートを新しいバージョンで開くのは遅いものなので
>しょうか?
確かに2003以前と2007以降はファイル形式が異なりますが、一応Access2010で2003形式のファイルは対応しているはずなので、そのようなことはあまりないかと思います(絶対とは言えませんが)。

私が思いつく可能性としては、元々のmdbファイルが既に壊れかけており、最適化によりとどめを刺したのではないかということです。
運用方法にもよりますが、アクセスのデータベースはちょっとしたことで破損することがあるので、最適化をしたら開けなくなるというのはままあることのようです。

もし変換前のmdbファイルが残っており、これをAccess2003なりAccess2010なりで開けるのであれば、手動でフォームやデータを新規ファイルにコピーし、以降はそれを使うといいでしょう。

なお、質問内容の直接的な原因ではないと思いますが、拡張子をaccdbに変更したというのは、単にファイル名を編集したということではないですよね?
・ツリー全体表示

【13116】DBの形式の違い
質問  オスマン  - 16/11/28(月) 15:27 -

引用なし
パスワード
   お世話になります。

ACCESS2003で作成した拡張子.mdbのレポートがあり
それは5秒ほどで開けるのですが、
拡張子を.accdbに変更してACCESS2010で最適化し、開こうとすると
ずっと処理中になって応答なしとなり開けないのですが
ACCESS2003で作成したレポートを新しいバージョンで開くのは遅いものなので
しょうか?

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

【13115】Re:レポートでのグループ化表示について
お礼  オスマン  - 16/11/15(火) 11:11 -

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

問題解決しました。
・ツリー全体表示

【13114】Re:レポートでのグループ化表示について
回答  hatena  - 16/11/10(木) 13:59 -

引用なし
パスワード
   >1つの業者に対して数値1と数値2は一通りしかありません。
>レポートにて業者ごとにページを表示する場合に
>業者のグループヘッダに数値1と数値2のテキストボックスを
>表示していて、それぞれのテキストボックスに「111」と「222」を
>表示したいのですが一番先頭の行?の「111」と「(null?)」が出てしまいます。
>
>これらを業者ごとに数値1と数値2をどちらもnull値ではない表示を行いたいのですが、方法はありますでしょうか?

コントロールソースを下記のように設定すればいいでしょう。

=Max([数値1])

=Max([数値1])

MinでもOKです。Max関数、Min関数は Null を無視しますので、数値が表示されます。
・ツリー全体表示

【13113】レポートでのグループ化表示について
質問  オスマン  - 16/11/10(木) 12:08 -

引用なし
パスワード
   よろしくお願いします。

クエリ上のデータで

業者 | 品名 | 数値1 | 数値2
X社 | AAA | 111 | null
X社 | BBB | null | 222
X社 | CCC | 111 | null
X社 | DDD | 111 | null
X社 | EEE | 111 | null

このようなデータがあり
1つの業者に対して数値1と数値2は一通りしかありません。
レポートにて業者ごとにページを表示する場合に
業者のグループヘッダに数値1と数値2のテキストボックスを
表示していて、それぞれのテキストボックスに「111」と「222」を
表示したいのですが一番先頭の行?の「111」と「(null?)」が出てしまいます。

これらを業者ごとに数値1と数値2をどちらもnull値ではない表示を行いたいのですが、方法はありますでしょうか?

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

【13112】Re:レポート「ビュー」・「印刷」について
お礼  まゆ  - 16/11/9(水) 14:33 -

引用なし
パスワード
   ▼hatena さん:
試してみます。
ありがとうございますm(_ _)m
・ツリー全体表示

【13111】Re:レポート「ビュー」・「印刷」について
回答  hatena  - 16/11/5(土) 0:17 -

引用なし
パスワード
   >>確かに、レポートの中にサブフォームを埋め込んだ場合、サブフォームの元になるデータが空だと何も表示されません。
>>ただ、フォームヘッダ・フッタであれば表示されるので、そこにラベルを用意しておけばそれは表示されますよ。それではダメでしょうか。
>そうですね・・・
>氏名 内容
>住所 内容
>・
>・
>・
>のような形式で印刷したいです。
>Nullの行がテーブルにできれば、表示されるのですが・・・

サブレポートのレコード件数が0でも、ラベルやテキストボックスの枠を表示したいということでしょうか。

案1

メインレポートの方に、サブレポートの背面に同じレイアウトになるようにラベルと非連結のテキストボックスを配置しておいて、サブレポートの「印刷時縮小」プロパティを「はい」にしておけばどうでしょう。
0件のときは、サプレポートの高さが0になり、背面のラベルやテキストボックスが現れます。

案2

サブレポートのレコード件数が 0 のときは、レコードソースをVBAで書き換える。

SELECT Null AS フィールド1, Null AS フィールド2, Null AS フィールド3 FROM テーブル名 WHERE ID = 1;

フィールド名、テーブル名は実際のものに変更してください。
WHERE句は1件のレコードが抽出される条件に。

実際に試していないので、うまくいくかは分かりません。
・ツリー全体表示

【13110】Re:レポート「ビュー」・「印刷」について
質問  まゆ  - 16/11/4(金) 14:09 -

引用なし
パスワード
   ▼亀マスター さん:
>フォームではなく、レポートの話ですね?
はい、レポートの話です。

>確かに、レポートの中にサブフォームを埋め込んだ場合、サブフォームの元になるデータが空だと何も表示されません。
>ただ、フォームヘッダ・フッタであれば表示されるので、そこにラベルを用意しておけばそれは表示されますよ。それではダメでしょうか。
そうですね・・・
氏名 内容
住所 内容



のような形式で印刷したいです。
Nullの行がテーブルにできれば、表示されるのですが・・・

難しいでしょうか。。。
・ツリー全体表示

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