Access VBA質問箱 IV

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

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


1 / 500 ページ 前へ→

【13136】Re:レコードロック違反をどうにかしたい
お礼  norimasa E-MAIL  - 17/3/5(日) 16:19 -

引用なし
パスワード
   自己解決しました。
ありがとうございました
・ツリー全体表示

【13135】レコードロック違反をどうにかしたい
質問  norimasa E-MAIL  - 17/3/5(日) 11:32 -

引用なし
パスワード
   皆様のお知恵をお借りしたいです。

DoCmd.RunSQL "UPDATE T_Ipt " & _
             "SET T_Ipt.請求月 = CStr(Year(T_Ipt![時刻])) & CStr(Format(Month(T_Ipt![時刻]),'00'))"

人様のプログラムですが、これを実行すると時々レコードロック違反ですべての
レコードの更新ができないことがあります(全レコードが違反で落とされます)。

この前後でADODBでレコードセットを開いたりはしていますが、このクエリを実行する
前は必ず閉じています。

この更新クエリを必ず成功させる方法がありましたらご教示いただきたいです。
よろしくお願いします
・ツリー全体表示

【13134】Access2016 VBA ボタンのイベントプロシ...
質問  shinyaYS E-MAIL  - 17/2/7(火) 13:01 -

引用なし
パスワード
   Access2016の環境でプログラムを実行を実行させているのですが、
ボタンに割り付けたクリックイベントのプロシージャが呼ばれないという現象が発生しています。

同じプログラムを他のPCで動作させると、そのイベントプロシージャが呼ばれるので、このPCのAccessの環境設定設定だと思うのですが、
分かりません。

どなたか、ご教授下さい。
・ツリー全体表示

【13133】価格値上がりの際マスターを触りたくない
質問  悩めるサリー  - 17/1/20(金) 17:03 -

引用なし
パスワード
   購入商品はすべて価格契約をしているのですが

今度値上することになりました

こういう場合新しくコードを振るのが通例だと思いますが、このコードは購入先でも管理しているコードのなので変更できません

例)
    商品コード 商品名    価格
旧価格 100001   いちごケーキ  @300
新価格 100001   いちごケーキ   @350

となります、価格を変更すると、今までの購入履歴の金額がすべて変わってしまうのでできません
商品コード以外にユニークなキーコードを持たせるべきだったのでしょうが、元々ありませんでした。

考えたこと:

今から通番ユニークキーを持たせる
通番の違う商品コード100001がふたつあることになります

で、商品購入(初回投入時)は新価格のリストからしか選べない様にする

という風に考えたのですが

もともと商品コードは主キーを設定していたため重複ありにしようとするとはずさなければなりません

主キーをはずそうとすると、エラーメッセージが出ます
主キーを変更できません。

このテーブルは、リレーションシップの主テーブルになっています。

主キーを変更または削除するには、リレーションシップウィンドウで関連するリレーションシップを削除する必要があります。

ここで、リレーションシップを削除することによっておこる不都合は何がありますでしょうか?

リレーションシップは

注文用の主テーブルとその中にあるサブテーブル(一対多でつながっている)

と一対多でリレーションされています

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

【13132】Re:全ページに折り目
回答  hatena  - 17/1/12(木) 15:07 -

引用なし
パスワード
   レポートでの話ですよね。

ページヘッダーの任意の位置に直線コントロールを配置すればどうでしょう。
・ツリー全体表示

【13131】全ページに折り目
質問  オスマン  - 17/1/11(水) 12:10 -

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

A4ページを横向きに使用しているのですが
用紙の上の箇所に3つ折りの折り目として
1mmの縦線を表示したいのですが、何かいい方法が
ありますでしょうか?

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

【13130】Re:数量が2つならレコードをコピー
お礼  まき  - 16/12/11(日) 22:15 -

引用なし
パスワード
   hatena様

お礼が遅くなってすみません
教えていただいたテーブルで書き換える方法で
できました

ありがとうございました!
・ツリー全体表示

【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に変更したというのは、単にファイル名を編集したということではないですよね?
・ツリー全体表示

1 / 500 ページ 前へ→
ページ:  ┃  記事番号:
966388
(SS)C-BOARD v3.8 is Free