Access VBA質問箱 IV

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

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


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

【9732】Re:枝番に連番を振る処理について
お礼  ゆか  - 07/8/3(金) 19:38 -

引用なし
パスワード
   Naoさん 初めまして。

ご丁寧な回答ありがとうございます。


まず、変数宣言の部分ですが、指摘されてびっくりしました。
まったく気づきませんでした。コピペなので原文そのままです。
どうしてエラーが出なかったんでしょうか・・・逆に不安です。
通常はVBEでデバッグ作業をすると思いますが、私はイマイチ
イミディエイトなどの見方や使い方が分からず、実際にDBで
実行してみて確認していました。そのときには何も出なかったんです。
本来のやり方をこれから勉強します。


次に、事業者NOのデータ型はご指摘いただいたとおり数値型でした。
変数宣言部分を As Integer に、Fldid1 = 0 に変更しました。
エリア名についてですが、実は時間の都合上データベースを作りながら
Accessを勉強していったという経緯がありまして、『間違いではないけれど
適切ではない』というものについての知識はまったくありませんでした。
形上はデータの格納もできますし、今のところエラーもないので(と自分では
思っているんですけど、普通に考えたらありえない話ですね。)
ある日、別のエリア名を変更したとき、クエリやフォーム、マクロなど
あらゆるものがエラーになってしまった経験があります。
指摘されたことはあったのですが訂正したときの弊害が大きすぎて
手が出せなくなってしまっていたというのが実際のところです。
最初に『テーブル』についてよく勉強をしなかったのを今でも悔やんでいます。

データ型が決まったので教えていただいた

>数字型なら
>
>rs2.FindFirst "事業者NO = " & rs1!事業者NO

を記述したところスムーズに動きました!ありがとうございます。


少しずつでもできるようになってくると楽しいですね。
本当にありがとうございました!
・ツリー全体表示

【9731】Re:findfirstの使い方
質問  メイ子  - 07/8/3(金) 18:46 -

引用なし
パスワード
   ▼ちょっちネ さん ご教示ありがとうございます。

>スレタイの通りFindFirstで戻ってるのですから、それを止めれば
>とりあえず、無限ループは回避できるかと。

そうですね、FindFirstだと最初に戻ることになるのですね。

>DlookUpで代用すると良いかと思います。

はい、DlookUpで代用したら、無限ループはなくなりましたが、
    ElseIf DLookup("休日", "休日一覧基本", "休日= #" & _
        DateSerial(Year(Date) + 1, Month(shukujitsu), _
        Day(shukujitsu)) + 1 & "#") <> Null Then

5月4日のところで、参照元テーブルに5月5日があるかどうかを検索する形には
なりましたが、5月5日があるはずなのに、nullを返してきます。
どこを直したらよいでしょうか?


>祝祭日データは手入力の方が手っ取り早いかと。

外部ユーザーが全くのパソコン初心者であることを想定してコード作成しております。自分が使う分には手入力で済ませますが・・。

>その場合は、5月3日が日曜日の場合も考えてみると良いかと思います。

そうですね、まだいろいろなパターンがあって複雑なコードになりそうです。
・ツリー全体表示

【9730】Re:予算残額の表示できるようにしたいので...
発言  ましゃ  - 07/8/3(金) 15:20 -

引用なし
パスワード
   Nao さん、ありがとうございました。

>Me![予算残額のフィールド名] = DLookUp("[予算残額]","Q_予算コード別残高","[予算1コード]= `" & Me![予算コードのフィールド名] & "`")
>
>と記述してみてください。
>(ただしこの書き方ですと予算コードはテキスト型です。)

試してみましたが、エラーが出てしまいました。
『クエリ パラメータとして指定した式でエラー』と。。
予算コードはテキスト型だったのですが。

何か考えられる原因はありますか?
・ツリー全体表示

【9729】Re:枝番に連番を振る処理について
回答  Nao  - 07/8/2(木) 18:01 -

引用なし
パスワード
   本当にこれ実行してエラーが出ないんですか?

単純なコピペならエラーバリバリだと思いますけど?
Dim ds As DAO.Database
  ^^
Set db = CurrentDb()
  ^^
そもそもここからエラーです。
(もしかして本物には On Error が付いてるとかはない?)

とりあえず FindFirst のところということで
事業者NO(2バイトの英数字はエリア名としては不適当ですが)
がテキスト型なら

rs2.FindFirst "事業者NO = '" & rs1!事業者NO & "'"

数字型なら

rs2.FindFirst "事業者NO = " & rs1!事業者NO

でどうでしょうか?

追伸:
事業者NOのエリア型が???です。
SQLの「T2.事業者NO) > 0)) 」から見ると数字型(でないとエラーになるはず)
Dim fldid1 As String に格納して比較しているところではテキスト型

まずこの辺で問題が出ると思いますけど・・・
・ツリー全体表示

【9728】Re:予算残額の表示できるようにしたいので...
回答  Nao  - 07/8/2(木) 17:24 -

引用なし
パスワード
   >=DLookUp("[予算残額]","Q_予算コード別残高","[予算1コード]= `予算コード`")
>ただ、入力してもそのままでは計算がされず、デザインビューに一旦して戻さないと、計算結果が表示されません。
>結果的に、計算はされているのですが、、、。

この通りであると(つまりDLookUpやQ_予算コード別残高は正常に作成されている)
と仮定して・・・

予算コードの更新後処理のイベントプロシージャで

Me![予算残額のフィールド名] = DLookUp("[予算残額]","Q_予算コード別残高","[予算1コード]= `" & Me![予算コードのフィールド名] & "`")

と記述してみてください。
(ただしこの書き方ですと予算コードはテキスト型です。)
・ツリー全体表示

【9727】Re:findfirstの使い方
発言  ちょっちネ  - 07/8/2(木) 17:10 -

引用なし
パスワード
   ▼メイ子 さん:

スレタイの通りFindFirstで戻ってるのですから、それを止めれば
とりあえず、無限ループは回避できるかと。

DlookUpで代用すると良いかと思います。


祝祭日データは手入力の方が手っ取り早いかと。

振替休日を含めても年間20日程度ですし、
第〇月曜だとか、振替規則だとかをコードに組み込むと
かなり大変だと思います。
(法改正とかあれば、コードの修正も。。。。)

15日程度だったら、年1回、10分もあれば出来ますし、
(数年分入力できるのであれば、数年に1回)
コード化するより断然簡単かと。。。。

VBAの勉強の為でしたら話は別ですけど。。。。。
その場合は、5月3日が日曜日の場合も考えてみると良いかと思います。


無駄レス失礼しました。
・ツリー全体表示

【9726】findfirstの使い方
質問  メイ子  - 07/8/2(木) 12:45 -

引用なし
パスワード
   こんにちは、メイ子と申します。
「休日一覧基本」というテーブルがあって、日付フィールドには1年の祝日が入力されています。その月と日を取得して、来年の祝日データを「休日一覧」というテーブルに追加していきたいのです。
来年は5月4日が日曜日と重なるので、5月6日が振替休日になるということも含めて、下記のようなコードを作成いたしました。
RS.FindFirst (5月4日のところ)を通った後、「休日一覧基本」の1つめのデータに戻ってしまい、そのまま無限ループ状態になります。
どこを直したらよろしいでしょうか?どなたかご教示お願いいたします。


Private Sub 更新_Click()
  Dim shukujitsu As Date
  Dim db As DAO.Database
  Dim RS As DAO.Recordset
  Dim RS2 As DAO.Recordset
  Dim strSQL As String
    strSQL = "SELECT * FROM 休日一覧基本 "
    Set db = CurrentDb()
    Set RS = db.OpenRecordset(strSQL, dbOpenDynaset)
    Set RS2 = db.OpenRecordset("休日一覧", dbOpenTable)

  Do Until RS.EOF
    shukujitsu = RS!休日
    RS2.AddNew
    If Weekday(Year(Date) + 1 & "/" & Month(shukujitsu) & "/" & _
      Day(shukujitsu)) <> 1 Then
      RS2!休日 = Year(Date) + 1 & "/" & Month(shukujitsu) & _
      "/" & Day(shukujitsu)
    Else
      RS.FindFirst "休日= #" & DateSerial(Year(Date) + 1, _
      Month(shukujitsu), Day(shukujitsu)) + 1 & "#"
      If RS.NoMatch Then
        RS2!休日 = DateSerial(Year(Date) + 1, Month(shukujitsu),_
        Day(shukujitsu)) + 1
      Else
        RS2!休日 = DateSerial(Year(Date) + 1, Month(shukujitsu),_
        Day(shukujitsu)) + 2
      End If
    End If
    RS2.Update
    RS.MoveNext
  Loop

  RS.Close
  RS2.Close
  Set RS = Nothing
  Set RS2 = Nothing

End Sub
・ツリー全体表示

【9725】枝番に連番を振る処理について
質問  ゆか  - 07/8/2(木) 10:20 -

引用なし
パスワード
   初めまして。
現在作っているデータベースで分からなくなってしまったので教えていただきたいのですが・・・。

記述したコードは事業者NOごとに入校許可証の番号を連番で振るというものです。単純に1番から振る場合には本で見て分かったのですが、今回教えていただきたいのは連番を更新するという手順です。
具体的に言いますと、
T1・・・現在有効な許可番号を収納したテーブル
T2・・・これまでに発行した許可番号を収納したテーブル
の2つがあり、事業者NOごとにT2から発行済み番号の最大値+1(stSQL2)を取得し
それをT1に順番に入れていく・・・これをDAOを使ってやろうと思っています。

コードは以下のとおりです。

Private Sub コマンド1_Click()

Dim ds As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim fld As DAO.Field
Dim fldid1 As String
Dim stSQL1 As String
Dim stSQL2 As String
Dim i As String
Dim j As String

'T1(現在データテーブル)の事業者NOと許可証番号を昇順に並び替え
stSQL1 = "SELECT T1.事業者NO, T1.許可証番号 FROM T1 WHERE (((T1.事業者NO) > 0)) ORDER BY T1.事業者NO, T1.許可証番号"

'交付済許可証番号マスター(履歴データテーブル)の次付与番号を事業者NOの昇順に並び替え
stSQL2 = "SELECT T2.事業者NO, Max(T2.許可証番号) AS 許可証番号の最大, Max(([許可証番号])+1) AS 次付与番号 FROM T2 GROUP BY T2.事業者NO HAVING (((T2.事業者NO) > 0)) ORDER BY T2.事業者NO"


Set db = CurrentDb()
Set rs1 = db.OpenRecordset(stSQL1, dbOpenDynaset)
Set rs2 = db.OpenRecordset(stSQL2, dbOpenDynaset)
Set fld = rs1.Fields("許可証番号")

If rs1.BOF = False Then
  rs1.MoveFirst
  i = 1
  fldid1 = ""
  
  
  Do Until rs1.EOF
    rs1.Edit
      If fldid1 <> rs1!事業者NO Then
        '事業者NOが変わったら交付済許可証番号マスターから次付与番号を取得
    ☆   rs2.FindFirst "事業者NO" = rs1!事業者NO
        j = rs2!次付与番号
        i = j
        fldid1 = rs1!事業者NO
      End If
      fld = i
    rs1.Update
    i = i + 1
    rs1.MoveNext
  Loop
End If

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
db.Close
Set db = Nothing

End Sub


もし改行などの関係でみにくくなってしまっていたらごめんなさい。

ループに入ったときに最初にT1の事業者NOを参照して同じ事業者NOをT2から検索し、stSQL2で出している次付与番号を取ってきてT1に入れていく。
そういった処理を『☆』のあたりに記述したつもりでした。いらない変数もありますが・・・。

実行してみても特にエラーが出ないためどのように記述したらよいのかよく分かりません。『☆』部分がおかしいのは間違いないとは思うのですが・・・
どなたか教えていただけないでしょうか。よろしくお願いします。
ちなみにまだ記述はしていませんが、最後にT1のレコードをすべてT2に追加して履歴として残すつもりです。
・ツリー全体表示

【9724】Re:Excel複数起動時に任意のブックを閉じる
お礼  Runa  - 07/8/1(水) 15:51 -

引用なし
パスワード
   ▼小僧 さん:お返事ありがとうございます。

>GetObject関数は Excel.Application オブジェクトだけでなく、
>Excel.Workbook オブジェクトに対しても使うことができます。
>
>Set wkb = GetObject(fname1)
>対象の Book が複数(2枚目以降は読取専用の状態で)開いているのでなければ
>目的の事はできると思われます。
>
>ちょっと工夫すれば
>
>>'他にExcelファイルが開いていない場合
>
>のような処理も行う事が可能ですね。

遅くなりましたが、、、
以下のように組直すとちゃんと動くようになりました。
本当にありがとうございます。

【Set xls = wkb_prg.Application】のような
逆転の発想が全くありませんでした。
頭を柔軟にして、考えないと駄目ですね!
精進します。

ーーーーーーーーーーーーーーーーーーーーーーーーーー
  Dim xls As Object        'As Excel.Application
  Dim wkb As Object        'As Excel.Workbook
  Dim wkb_prg As Object      'As Excel.Workbook
  Dim wkb_lst As Object      'As Excel.Workbook
  Dim fName1 As String      'ファイル名
  Dim fName2 As String
  Dim flg As Boolean       'その他Excelが開いているか判定するフラグ
  
  flg = True 'フラグ初期化
  
  fName1 = "C:\sample\file1.xls"    'Excelファイル指定
  fName2 = "C:\sample\file2.xls"

  '重複オープンのチェック
  On Error Resume Next
  
  Set wkb_prg = GetObject(fName1)
  Set wkb_lst = GetObject(fName2)
  Set xls = wkb_prg.Application
    
  If Err.Number <> 0 Then
    Err.Clear  ' Errをクリア
  Else
    '同名のブックは閉じる
    wkb_prg.Name = Dir(fName1)
    wkb_prg.Close SaveChanges:=False
  
    wkb_lst.Name = Dir(fName2)
    wkb_lst.Close SaveChanges:=False
        
    For Each wkb In xls.Workbooks
      flg = False
    Next wkb

    '他にExcelファイルが開いていない場合
    If flg = True Then
      xls.Quit  '"Excel.application"を閉じる
    End If
  End If

  Set xls = Nothing
・ツリー全体表示

【9723】予算残額の表示できるようにしたいのですが
質問  ましゃ  - 07/8/1(水) 15:29 -

引用なし
パスワード
   初心者なので、質問の意味自体がわからないかもしれませんがよろしくお願い致します。

フォームで予算コードを入力すると、別のクエリにてコードごとの予算額からこれまで使用済みの予算残額を計算させて表示するように、予算残額のコントロールソースに次の計算式を入れています。(なお、予算コードは1つの案件に対して、複数使えるように番号をふっています。)
=DLookUp("[予算残額]","Q_予算コード別残高","[予算1コード]= `予算コード`")
ただ、入力してもそのままでは計算がされず、デザインビューに一旦して戻さないと、計算結果が表示されません。
結果的に、計算はされているのですが、、、。


どうしたら、予算コードを入力したら、すぐに予算残額が表示されるようにできるのでしょうか?
教えてください。宜しくお願い致します。
・ツリー全体表示

【9722】Re:Excel複数起動時に任意のブックを閉じる
回答  小僧  - 07/8/1(水) 14:59 -

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

>「開かれている任意のExcelブックを閉じる」ということがしたいです。

>開かれている任意のExcelブックをAccessから閉じることはできましたが、
>複数のExcelアプリケーションが起動している場合にうまく動作しません。

GetObject関数は Excel.Application オブジェクトだけでなく、
Excel.Workbook オブジェクトに対しても使うことができます。

Set wkb = GetObject(fname1)

対象の Book が複数(2枚目以降は読取専用の状態で)開いているのでなければ
目的の事はできると思われます。

ちょっと工夫すれば

>'他にExcelファイルが開いていない場合

のような処理も行う事が可能ですね。
・ツリー全体表示

【9721】Excel複数起動時に任意のブックを閉じる
質問  Runa  - 07/8/1(水) 13:48 -

引用なし
パスワード
   「開かれている任意のExcelブックを閉じる」ということがしたいです。

開かれている任意のExcelブックをAccessから閉じることはできましたが、
複数のExcelアプリケーションが起動している場合にうまく動作しません。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  flg = True 'フラグ初期化

  '重複オープンのチェック
  On Error Resume Next
  Set xls = GetObject(, "Excel.Application")
  If Err.Number <> 0 Then
    Err.Clear  ' Errをクリア
  Else
    '同名のブックは閉じる
    For Each wkb In xls.WorkBooks
      If wkb.Name = Dir(fName1) Then
        wkb.Close SaveChanges:=False

      ElseIf wkb.Name = Dir(fName2) Then
        wkb.Close SaveChanges:=False
      Else
        flg = False
      End If
    Next wkb

    '他にExcelファイルが開いていない場合
    If flg = True Then
      xls.Quit  '"Excel.application"を閉じる
    End If
  End If

  Set xls = Nothing
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

Set xls = GetObject(, "Excel.application")
をループ文か何かでまわせればうまく動きそうな気がしますが、
その方法がわかりません。

どなたか教えて下さい。よろしくお願いします。
・ツリー全体表示

【9720】Re:クロス集計クエリ
お礼  BWY  - 07/7/30(月) 16:31 -

引用なし
パスワード
   ▼たん さん:
第3のクエリで結合する事で解決致しました。
クロス集計クエリもだいぶ活用出来る様になりました。
この度は迅速なご回答、誠にありがとうございました。
・ツリー全体表示

【9719】Re:クロス集計クエリ
回答  たん  - 07/7/30(月) 13:04 -

引用なし
パスワード
   1個のクエリでは無理なので、

売上Aのクロス集計クエリ
売上Bのクロス集計クエリ

をそれぞれ作成し、両クエリを結合した、第3のクエリを
表示用として活用すべきでしょう。
・ツリー全体表示

【9718】Re:クロス集計クエリ
質問  BWY  - 07/7/30(月) 11:39 -

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

クロス集計クエリを調べ作成出来ました。
しかし前回、なるべく簡単に書いたのですが
実は下の図の様に売上げBも存在し
4月の売上げ、5月の売上げと列にしたいのですが
これもクロス集計クエリで解決出来ますでしょうか。

私がデザインビューから作成してみたところ
下記の様なエラーが出てしまいました。
『クロス集計クエリを作成するには、1つまたは複数の行見出しオプション、1
つの列見出しオプション、1つの値オプションを指定する必要があります。』

やはり2つ以上の値がある場合はクエリでは不可能なのでしょうか。
モジュールを作成する必要があるのでしょうか。
大変申し訳ありませんが再度、ご教授願います。

【表A】
年度    期間    営業員    商品    売上げA 売上げB
2007    200704   Aさん    商品1    100   10
2007    200705   Aさん    商品1    200   20
2007    200704   Aさん    商品2    300   30
2007    200705   Aさん    商品2    400   40
2007    200704   Bさん    商品1    500   50
2007    200705   Bさん    商品1    600   60
2007    200704   Bさん    商品2    700   70
2007    200705   Bさん    商品2    800   80

        ↓

【表B】                
年度    営業員  商品  売上げA04 売上げA05  売上げB04 売上げB05
2007    Aさん   商品1   100    200      10      20
2007    Aさん   商品2   300    400      30      40
2007    Bさん   商品1   500    600      50      60
2007    Bさん   商品2   700    800      70      80
・ツリー全体表示

【9717】Re:「重複データ非表示」と「グループフッ...
お礼  pinetree  - 07/7/30(月) 9:38 -

引用なし
パスワード
   ▼hatena さん:
>>事業所フッター のフォーマット時イベントで
>>
>>Me.MoveLayout = False
>
>事業所フッターではなくて、会社名ヘッダー、事業所ヘッダー に
>このコードを記述します。
>
>もう一度、最初から私の回答を読み直して、
>その通りにしてください。

お騒がせして申し訳ありませんでした。
ご指導どおりにしたら、望みどおりになりました。
ありがとうございました。
・ツリー全体表示

【9716】Re:クロス集計クエリ
回答  たん  - 07/7/30(月) 8:36 -

引用なし
パスワード
   表Bについて、編集の必要が無いのなら、

クロス集計クエリで可能でしょう。

まずは、ヘルプや教本で、「クロス集計クエリ」とはどんな使われ方を
するのかを確認して下さい。
・ツリー全体表示

【9715】表の加工
質問  BWY  - 07/7/29(日) 19:06 -

引用なし
パスワード
   【表A】を【表B】の様に加工したいのですがどの様にすれば宜しいでしょうか。
【表A】の期間が【表B】の売上げに吸収され4月の売上げ、5月の売上げと列になり
営業員と商品毎に表示したいです。【表A】と【表B】は別表でも構いません。
モジュールを作成するかクエリなので可能なのか
どなたかご教授お願い致します。

【表A】
年度    期間    営業員    商品    売上げ
2007    200704    Aさん    商品1    100
2007    200705    Aさん    商品1    200
2007    200704    Aさん    商品2    300
2007    200705    Aさん    商品2    400
2007    200704    Bさん    商品1    500
2007    200705    Bさん    商品1    600
2007    200704    Bさん    商品2    700
2007    200705    Bさん    商品2    800                

        ↓

【表B】                
年度    営業員    商品    売上げ04    売上げ05
2007    Aさん    商品1    100    200
2007    Aさん    商品2    300    400
2007    Bさん    商品1    500    600
2007    Bさん    商品2    700    800
・ツリー全体表示

【9714】Re:「重複データ非表示」と「グループフッ...
回答  hatena  - 07/7/27(金) 15:07 -

引用なし
パスワード
   >事業所フッター のフォーマット時イベントで
>
>Me.MoveLayout = False

事業所フッターではなくて、会社名ヘッダー、事業所ヘッダー に
このコードを記述します。

もう一度、最初から私の回答を読み直して、
その通りにしてください。
・ツリー全体表示

【9713】Re:「重複データ非表示」と「グループフッ...
質問  pinetree  - 07/7/27(金) 14:01 -

引用なし
パスワード
   ご指導に従っていろいろ試してみましたがうまくいきません。
再度確認のために条件を整理します。

下記のようなデータがあります。

(A)
NO    会社名    事業所名    担当者名
1    東北商事    本社    山田
2    東北商事    本社    佐藤
3    東北商事    仙台支社  田中
4    北陸物産    本社    鈴木
5    北陸物産    金沢支店  安倍
6    北陸物産    金沢支店  塩崎

詳細SECTION で会社名・事業所名を「重複データ非表示」
にして下記のようにレポートを作成したい
のですが

(B)
NO    会社名    事業所名    担当者名
01   東北商事    本社   山田
02               佐藤
03-----------------------------------
04          仙台支社  田中
05===================================
06   北陸物産    本社   鈴木
07-----------------------------------
08          金沢支店  安倍
09                塩崎
10===================================

会社名・事業所名のところにグループフッターを「あり」
にすると事業所が変わったところで会社名が表示され
下記のようになってしまいます。
NO 04 と 08 の会社名は非表示にしたいのです。

(C)
NO    会社名    事業所名    担当者名
01   東北商事    本社   山田
02               佐藤
03-----------------------------------
04   東北商事   仙台支社  田中
05===================================
06   北陸物産    本社   鈴木
07-----------------------------------
08   北陸物産    金沢支店  安倍
09                塩崎
10===================================

ご指導に従って
事業所フッター のフォーマット時イベントで

Me.MoveLayout = False

とすると

事業所フッター印字後の改行がされなくて
03と04行及び07と08行が重なって
印字されてしまいます。
・ツリー全体表示

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