Access VBA質問箱 IV

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

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


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

【8063】EOFの入れ子について
質問  Satsuki  - 06/6/27(火) 11:50 -

引用なし
パスワード
   Satsukiと申します。いろいろ探してみましたが、わかりませんでしたので、どなたかお教え頂けますでしょうか?よろしくお願いいたします。

下記のようなコードを作り、「データ」テーブルと「位置」テーブルのすべてのデータについて計算しようと思いました。動かしてみると、
「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には現在のレコードが必要です。」
と表示され、「データ」テーブルの件数分だけ一巡して計算された後、
rs3![kyoriX] = rs2![X1] - rs1![X]
のところが黄色くなります。
どこを直したらよいでしょうか?お手数ですがお願いいたします。

Public Sub keisan()
Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim rs3 As ADODB.Recordset

Set cn = CurrentProject.Connection
Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
Set rs3 = New ADODB.Recordset

rs1.Open "データ", cn, adOpenStatic, adLockReadOnly
rs2.Open "位置", cn, adOpenStatic, adLockReadOnly
rs3.Open "距離", cn, adOpenKeyset, adLockOptimistic

rs1.MoveFirst

Do Until rs1.EOF
  Do Until rs2.EOF
    rs3.AddNew
      rs3![kyotenmei] = rs2![拠点名]
      rs3![kyoriX] = rs2![X1] - rs1![X]
      rs3![kyoriY] = rs2![Y1] - rs1![Y]
    rs3.Update
  rs2.MoveNext
rs1.MoveNext
Loop
Loop

rs1.Close
rs2.Close
rs3.Close

cn.Close

End Sub
・ツリー全体表示

【8062】Re:関数の作り方を教えてください。
回答  クロ  - 06/6/27(火) 11:36 -

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

>結果
>A・100、C・500、D・1000

結果が横でなければ

SELECT [名前] & "・" & [数字] AS 式1
FROM テーブルA
WHERE [数字]<>0;

でもいいのでは?
・ツリー全体表示

【8061】Re:ディレクトリのチェック
回答  Gin_II  - 06/6/27(火) 11:35 -

引用なし
パスワード
   > ディレクトリが実際に存在するかを判定したいのですが、dir関数では、
> 実際にないものまであるものとして返ってきてしまいます。

どのように記述して、どういったフォルダが該当するのでしょうか?

DIR 関数の、Attributes 引数で、vbDirectory を指定しても、そのような
結果が返ってくるのでしょうか?


別案としてだすなら、FileSystemObject あたりでしょうか。

GetFolder メソッド
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/jscolfolders.asp
・ツリー全体表示

【8059】Re:関数の作り方を教えてください。
回答  Gin_II  - 06/6/27(火) 11:30 -

引用なし
パスワード
   > 作りたい関数は、テーブルAに項目、A・B・C・D・E
> (項目はもっとあります)があり、数字が入っています。
> 関数で、A・B・C・D・Eを設定して、項目が0以外の
> 場合、項目と数字をつなげてひとつのデータにしたいのです。

MID(IIF([A]=0, "", "," & "A" & "・" & [A]) &
  IIF([B]=0, "", "," & "B" & "・" & [B]) &
  IIF([C]=0, "", "," & "C" & "・" & [C]) &
  IIF([D]=0, "", "," & "D" & "・" & [D])
 , 2)

そんなに、大変じゃないような ^^;


Function 関数名(ParamArray FLD() As Variant) As String

  Dim lngIdx     As Long
  
  If UBound(FLD) = 0 Then
    関数名 = ""
    Exit Function
  End If
  
  For lngIdx = 0 To UBound(FLD) Step 2
    If FLD(lngIdx + 1) > 0 Then
      関数名 = 関数名 & "," & FLD(lngIdx) & "・" & FLD(lngIdx + 1)
    End If
  Next lngIdx
  
  関数名 = Mid(関数名, 2)
  
End Function

【使用例】
関数名("A",[A],"B",[B],"C",[C],"D",[D])

のように、フィールド名, フィールド・・・・・と続けて
指定してみてください。

また、分かりやすいように、"関数名" としていますが、実際には
別の名前にしてください。(半角英数で。)
・ツリー全体表示

【8058】ディレクトリのチェック
質問  あ〜くせす  - 06/6/27(火) 11:20 -

引用なし
パスワード
   はじめまして、あ〜くせすと申します。

ディレクトリが実際に存在するかを判定したいのですが、dir関数では、実際にないものまであるものとして返ってきてしまいます。
また、getattr関数ではエラーが多すぎて、逆に困ってしまいます。
wizhookをつかえば、ファイルに限っては実際にあるかどうかをtrueかfalseで判定できるようですが、ディレクトリの場合判定できないのでしょうか?希望ではこのように存在したときと、しなかったときに何かしらの値を返すものが希望なのですが。(エラー処理はあまり使いたくないので)
保存先フォルダを指定しなければならないところで、かなりつまづいてしまってます。アクセスを始めてまだ1ヶ月の初心者ですが、希望の形ではなくてもかまいませんので、何かいい方法、アイデアがあれば、どうかよろしくお願いします。OSはwindwsXP、アクセス2003を使用しています。
・ツリー全体表示

【8057】関数の作り方を教えてください。
質問  たけし  - 06/6/27(火) 10:54 -

引用なし
パスワード
   はじめまして、今まで関数を作成したことがありません。
どうか助けてください。今までにモジュールは作成したことはありますが、初心者なのでよろしくお願いします。
作りたい関数は、テーブルAに項目、A・B・C・D・E(項目はもっとあります)があり、数字が入っています。関数で、A・B・C・D・Eを設定して、項目が0以外の場合、項目と数字をつなげてひとつのデータにしたいのです。

A・・100
B・・0
C・・500
D・・1000
E・・0
関数(A,B,C,D,E)
結果
A・100、C・500、D・1000
というデータを作成したいのですが作成できるのでしょうか?
クエリーでiff文でやるには大変なので関数で作成したいのです。
よろしくお願いします。
・ツリー全体表示

【8056】Re:変数におけるnullの扱い
お礼  kyou  - 06/6/26(月) 14:11 -

引用なし
パスワード
   ”目から鱗”でした。
ご指摘頂いて気がつきました。
Nullを扱えるのは、バリアント型でした。
変数をバリアント型にして
SQL文を少し変えたら期待どおりに動きました。
どうもありがとうございます。
・ツリー全体表示

【8055】Re:変数におけるnullの扱い
お礼  kyou  - 06/6/26(月) 14:07 -

引用なし
パスワード
   ▼クロ さん:

"WHERE (((T_工事台帳.営業所コード) Like '*' & " & strCD & " & '*'));"
>
>"WHERE (((T_工事台帳.営業所コード) Like '*" & strCD & "*'));"

>※strCD が Null だったらすべてを表示


期待通りに動きました。
ありがとうございます。
 " の使い方が初心者にはとても難しいと思います。
変数は""の外に出して
""内にある"は'に変えなければならないのですね。
ご丁寧なご指導有難うございます。
・ツリー全体表示

【8054】Re:変数におけるnullの扱い
発言  Gin_II  - 06/6/26(月) 12:27 -

引用なし
パスワード
   >strCDがnullの場合は
>”nullの使い方が不正です”というメッセージが出てしまって動きません。
>strCDへの代入する式の問題だと思うのですが
>お分かりの方がいらっしゃいましたらお教え下さい。

これの直接の原因は、
>Dim strCD As String
String 型の変数に、Nullを代入しようとしているからですね。

Nullを扱えるのは、Variant 型です。
・ツリー全体表示

【8053】Re:変数におけるnullの扱い 追伸
発言  クロ  - 06/6/26(月) 11:55 -

引用なし
パスワード
   処理をキャンセルしたいのなら
strCD = DLookup("営業所コード", "WT_設定マスタ", "pk='1'")

If IsNull(strCD) Then
 MsgBox "対象がありません"
Else
 strSQL = "INSERT INTO WT_個別原価管理表 ( 工事番号 ) " & _
     "SELECT T_工事台帳.工事番号 " & _
     "FROM T_工事台帳 " & _
     "WHERE (((T_工事台帳.営業所コード) Like '*" & strCD & "*'));"

DoCmd.RunSQL strSQL
End If

とかでしょうか?
・ツリー全体表示

【8052】Re:変数におけるnullの扱い
回答  クロ  - 06/6/26(月) 11:37 -

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

>     "WHERE (((T_工事台帳.営業所コード) Like '*' & " & strCD & " & '*'));"

"WHERE (((T_工事台帳.営業所コード) Like '*" & strCD & "*'));"
でどうですか?

※strCD が Null だったらすべてを表示
・ツリー全体表示

【8051】変数におけるnullの扱い
質問  kyou  - 06/6/26(月) 11:26 -

引用なし
パスワード
   WinXp
Access2002です。
strSQLをクエリで次のように作り、strCDがnullには
問題なく全てのレコードが表示されます。

-------------------------------------------
SELECT T_工事台帳.工事番号
FROM T_工事台帳
WHERE (((T_工事台帳.工事番号) Like '*' & DLookUp("営業所コード","WT_設定マスタ","pk='1'") & '*'));


でも以下のようにモジュールに書くと
strCDがnullの場合は
”nullの使い方が不正です”というメッセージが出てしまって動きません。
strCDへの代入する式の問題だと思うのですが
お分かりの方がいらっしゃいましたらお教え下さい。

-------------------------------------------
Public Sub PS_個別原価管理表作成()

Dim strCD As String
Dim strSQL As String

strCD = DLookup("営業所コード", "WT_設定マスタ", "pk='1'")

strSQL = "INSERT INTO WT_個別原価管理表 ( 工事番号 ) " & _
     "SELECT T_工事台帳.工事番号 " & _
     "FROM T_工事台帳 " & _
     "WHERE (((T_工事台帳.営業所コード) Like '*' & " & strCD & " & '*'));"

DoCmd.RunSQL strSQL

End Sub
・ツリー全体表示

【8050】Re:エクスポート処理時の条件範囲
回答  クロ  - 06/6/26(月) 10:20 -

引用なし
パスワード
   おはようございます。

>  strSQL2 = "SELECT 連休番号, 連休, User FROM Q_Name WHERE (((Q_Name.No_連休)=[]));"

パラメータが空なのは何故?
Q_Nameクエリ内に「No_連休」というフィールドはあるのでしょうか?
単に「連休番号=パラメータ」でよいのでは?
それ以降のコードでレコードの存在をチェックして、OutputToで出力していますが、InputBoxを使ったほうがいいかもです。

Dim RN As Integerをしてから

strSQL2のところを

RN = InputBox("連休番号を指定してください")
strSQL2 = "SELECT 連休番号, 連休, User FROM Q_Name WHERE 連休番号=" & RN & ";"

でどうですか?
・ツリー全体表示

【8049】Re:変数へ日付を代入する
お礼  kyou  - 06/6/26(月) 10:00 -

引用なし
パスワード
   ▼クロ さん:
>こんにちは
>
>>受注日が月末の場合に hh:mm がついていると抽出対象外になるので
>>クエリのデザイングリッドでは
>>Format([受注日],"yyyy/mm/dd")としてhh:mmを排除していました。
>
>混然しているとそうなるようですね。
>CDate(Format([受注日],"yyyy/mm/dd")
>のようにフォーマット後に明示的に日付型にしてあげてはどうでしょうか?

フォーマット関数でやってみましたら
ちゃんと動きました。
ありがとうございました。
・ツリー全体表示

【8048】Re:エクスポート処理時の条件範囲
発言  あくせーす  - 06/6/26(月) 2:20 -

引用なし
パスワード
   ▼クロ さん:

ご回答を頂きまして、ありがとうございます。

ボタンクリックイベントに、SQL文でパラメータ用のクエリを一時的に作成し、エクスポートした後、
削除する形で対応してみましたが、パラメータが少なすぎる。1を指定してください。と
エラーが表示されてしまいます。

  Dim MyDb2 As DAO.Database
  Dim MyQd2 As DAO.QueryDef
  Dim MyTb2 As DAO.Recordset

  Dim strSQL2 As String
  Dim strQryName2 As String
  Dim varQryName2 As Variant

  '既存のクエリ名を指定する。
  strQryName2 = "Q_Name"
  '新規作成のクエリ名を指定する。
  varQryName2 = "Q_エクスポート用Name"

  Set MyDb2 = CurrentDb

  '同名のクエリは削除
  MyDb2.QueryDefs.Refresh
  For Each MyQd2 In MyDb2.QueryDefs
    If MyQd2.Name = varQryName2 Then
      MyDb2.QueryDefs.Delete MyQd2.Name
    End If
  Next MyQd2

  '新規クエリ作成
  strSQL2 = "SELECT 連休番号, 連休, User FROM Q_Name WHERE (((Q_Name.No_連休)=[]));"
  Set MyQd2 = MyDb2.CreateQueryDef(varQryName2, strSQL2)
  Set MyTb2 = MyQd2.OpenRecordset()

  If Not MyTb2.EOF Then
    strSQL2 = strQryName2 & " をExcelファイルへ出力します。" & Chr(13) & _
         "よろしければ、OKをクリックして下さい。"
  Else
    strSQL2 = "出力データがありません。処理を中止します。"
    MsgBox strSQL2, vbOKOnly, "通知"
    GoTo exit_qryToExcel
  End If

  If MsgBox(strSQL2, vbOKCancel, "確認") = vbCancel Then
    GoTo exit_qryToExcel
  End If

  '保存ダイアログ表示後出力
  'OutputTo での出力は Excel 5.0 の仕様の為、行数の上限が 16,384 行となる。
  DoCmd.OutputTo acQuery, varQryName2, acFormatXLS, , True
  'MsgBox "出力終了しました。", vbOKOnly

exit_qryToExcel:
<略>

err_qryToExcel:
<略>


>PARAMETERS [連休番号を指定してください] Long;
>SELECT 連休番号, 連休, User
>FROM テーブル名
>WHERE 連休番号=[連休番号を指定してください];

単純にQ_Nameをパラメータクエリとして作成し、連休番号20を入力すれば
番号が20のレコードかつ、不要なフィールドを除くフィールドを表示することは、
できるんですが、今回はフォームのボタンでエクスポートさせたいことです。

ただ、やりたい内容は下記です。

連休番号  連休  User  Password  ・・・(略)
20     秋休み A    ***
20     秋休み B    ***
20     秋休み C    ***
30     春休み A    ***
30     春休み B    ***
30     春休み C    ***
30     春休み D    ***
40     夏休み A    ***
40     夏休み B    ***
40     夏休み C    ***
40     夏休み D    ***
40     夏休み E    ***
40     夏休み F    ***
40     夏休み G    ***

とする。

エクスポートすると、
連休番号  連休  User ・・・エクスポートしたいフィールド名
40     夏休み A
40     夏休み B
40     夏休み C
40     夏休み D
40     夏休み E
40     夏休み F
40     夏休み G

となるんですが、

テーブルに連休番号50を追加するという場合も考慮したい。
その場合は連休番号が常に最大値の数値のみを抽出するクエリ用のSQL文を
記述(不要なフィールドも)するSQL文はどのように表現すればよいでしょうか?
上記のstrSQL = "" の中に記述すればよいですが・・・

サーバにテーブルを持たせて、各PCは配布ファイルを起動するので
プログラムで指定するのではなく、テーブルを参照するようにしたい。

分かる方、教えて下さい。
・ツリー全体表示

【8047】Re:参照設定
お礼  アクセク  - 06/6/24(土) 21:39 -

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

()に関しては、元々のスクリプトにはありませんでした。
昔読んだ参考書に、「関数は引数の有無にかかわらず()が必要」と有ったことや、他のサイトでの参考事例を拝見して、()を付けて投稿しました。
実際()の有無にかかわらずエラーは出ていました。

そうですか、XPと97はサポート外ですか・・・、基本的なところが良くわからないまま、97で何とか動くものを作成して重宝していたものですから、ちょっとした書き直しで何とかそのまま使用できたら良いなと単純に考えていました。

200nへの乗換えを考慮し、この件に関しては解決といたします。
いろいろとありがとうございました。
今後ともよろしくお願いいたします。
・ツリー全体表示

【8046】Re:フォーム上でフィールドの集計
お礼   E-MAIL  - 06/6/24(土) 19:48 -

引用なし
パスワード
   ▼てっちゃん さん:
>▼雅 さん:
>>これで、フォームを開くとテキストボックス[合計]に金額の合計
>>値が表示されますが、金額の値を変えたり、レコードを追加した
>>りした場合、[合計]が再計算されません。何か良い方法があるの
>>でしょうか?
>
>変更後や、追加後に
>Me.Recalc   (再計算)
>を行ってみては如何でしょう。

てっちゃん様
 ありがとうございました。見事、計算されました! 朝からこれで
 ずっと苦戦してたんです。本当にありがとうございました。
・ツリー全体表示

【8045】Re:フォーム上でフィールドの集計
回答  てっちゃん  - 06/6/24(土) 16:36 -

引用なし
パスワード
   ▼雅 さん:
>これで、フォームを開くとテキストボックス[合計]に金額の合計
>値が表示されますが、金額の値を変えたり、レコードを追加した
>りした場合、[合計]が再計算されません。何か良い方法があるの
>でしょうか?

変更後や、追加後に
Me.Recalc   (再計算)
を行ってみては如何でしょう。
・ツリー全体表示

【8044】フォーム上でフィールドの集計
質問   E-MAIL  - 06/6/24(土) 15:13 -

引用なし
パスワード
   教えてください。

表形式のフォームのフッタに作成した、テキストボックス[合計]
にフィールド[金額]の合計を表示したいのですが、コントロール
ソースに =sum(T_明細!金額) と式を入力してます。

これで、フォームを開くとテキストボックス[合計]に金額の合計
値が表示されますが、金額の値を変えたり、レコードを追加した
りした場合、[合計]が再計算されません。何か良い方法があるの
でしょうか?

どなたか教えていただけますか。
・ツリー全体表示

【8043】Re:文字列から数字だけを取り出したい
お礼  初心者です  - 06/6/24(土) 4:24 -

引用なし
パスワード
   先生、解決しました!
ありがとうございました。
これで一歩前進です。
まだまだ先は長い・・・
・ツリー全体表示

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