Access VBA質問箱 IV

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

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


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

【6920】フィールドをクエリでつなげるには
質問  にしもり  - 05/12/7(水) 18:22 -

引用なし
パスワード
   こんにちは。
2つのテーブルa、bに、10000ずつデータがあるとします。
フィールドは双方20あります。
困ったことに、まったく同じレコードがある可能性があります。
それを検証するために、20のうち10個のフィールドをクエリでつなげたいとおもうのですがそのようなときは
CONCUTINATE関数をつかえばよいのでしょうか?
・ツリー全体表示

【6919】Re:クエリでマクロを組んだものを、エクス...
お礼  サチチ  - 05/12/6(火) 14:56 -

引用なし
パスワード
   ▼小僧 さん:

>[#5317] と一緒ですね ^^;

すみません。以前教わっていたのに、頭から、すっぽり
抜けてました。_(_^_)_

出来ました!!なんてすばらしいのでしょう♪
毎回、感動しまくりです。
今回も助けていただき、ありがとうございました。

この仕事も、私は2月末までで終了です。
私事ですが、今後はママになる予定です。それまで、何かある?かも?
なので、またご教授願います。

              お腹のデカイ、サチチでした!
・ツリー全体表示

【6918】Re:クエリでマクロを組んだものを、エクス...
発言  小僧  - 05/12/6(火) 14:26 -

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

[#5317] と一緒ですね ^^;

もう一度確かめてみて下さい。
・ツリー全体表示

【6917】Re:クエリでマクロを組んだものを、エクス...
質問  サチチ  - 05/12/6(火) 14:16 -

引用なし
パスワード
   ▼小僧 さん:

こんにちは!いただいた、イベントをそのまま貼り付け、コマンドボタンの
名前にExcel出力とし、やってみたのですが、こんなエラーが出ました。

"コンパイルエラー ユーザー定義型は定義されていません"

>Private Sub Excel出力_Click()
>'要参照 DAO x.x Object Library
>Dim xlsApp As Object
>Dim xlsWkb As Object
>Dim xlsSht As Object
>Dim QD As DAO.QueryDef
↑ここが、ブルーになります。


>Const QName = "クエリ3年"
は、クエリ管理開始5年 という名前なので、変更しました。

>出力ファイルを指定する欄を空白にすると、
>ファイルをどこに保存するかのダイアログが出現しますが、
>そちらでは駄目なのでしょうか。

初めて知りました!毎回、ためになります。これでOKです。
こちらは、名前をつけて、保存に成功です!!ありがとうございます。
・ツリー全体表示

【6916】Re:クエリでマクロを組んだものを、エクス...
回答  小僧  - 05/12/6(火) 13:24 -

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

>・名前は、名前をつけて保存の様にしたいのです。(自分の好きな名前)

ちょっとこちらに苦労していたのですが、
Excelのファイルダイアログを使ってみました。
バージョン依存なので、うまく行かなかったら他のを考えてみます。

Private Sub Excel出力_Click()
'要参照 DAO x.x Object Library
Dim xlsApp As Object
Dim xlsWkb As Object
Dim xlsSht As Object
Dim QD As DAO.QueryDef
Dim RS As DAO.Recordset
Dim i As Long
Dim strField As String

Const QName = "クエリ3年"
Const Ex_msoFileDialogSaveAs = 2

  If IsNull(Me.txt年) Then
    MsgBox "年を入力してから実行してください。"
    Exit Sub
  End If
    
  Set QD = CurrentDb.QueryDefs(QName)
    QD.Parameters(0).Value = Me.txt年.Value
  Set RS = QD.OpenRecordset
  
  Set xlsApp = CreateObject("Excel.Application")
    xlsApp.Visible = True
  Set xlsWkb = xlsApp.Workbooks.Add
    With xlsWkb.Sheets("sheet1")
      For i = 1 To RS.Fields.Count
        strField = RS(i - 1).Name
        If InStr(1, strField, "年目") > 0 Then
          strField = Me.txt年 + Val(strField) - 1 & "年"
        End If
        .Cells(1, i).Value = strField
      Next
        .Range("A2").CopyFromRecordset RS
    End With
    
    With xlsApp.FileDialog(Ex_msoFileDialogSaveAs)
      .Show
      If .SelectedItems.Count = 0 Then
        xlsWkb.Saved = True
      Else
        xlsApp.DisplayAlerts = False
          xlsWkb.SaveAs .SelectedItems(1)
        xlsApp.DisplayAlerts = True
      End If
    End With
    
    xlsWkb.Close: Set xlsWkb = Nothing
    xlsApp.Quit: Set xlsApp = Nothing
  RS.Close: Set RS = Nothing
  QD.Close: Set QD = Nothing
End Sub

>Const QName = "クエリ3年"

の行は現在使用しているクエリの名前に変更して下さい。


>別で質問を出そうかと思っていたのですが、これもご一緒の質問でいいですか?

殆ど VBA で作成しているので、マクロは苦手だったりします^^;

>・出力ファイル=D:\UserArea\デスクトップ\判定日付全てブランク.xls
> ↑
>これを、毎回好きな名前にしたいのです。

出力ファイルを指定する欄を空白にすると、
ファイルをどこに保存するかのダイアログが出現しますが、
そちらでは駄目なのでしょうか。
・ツリー全体表示

【6915】Re:クエリでマクロを組んだものを、エクス...
質問  サチチ  - 05/12/6(火) 11:04 -

引用なし
パスワード
   ▼小僧 さん:

こんにちは。

>他の回答者の方が答えにくくなってしまいますよ^^;
・・・申し訳ないです。

>どちらにエクスポートするのでしょうか。
Excelファイルにしたいと思ってます。

>・コンボボックスを更新したら毎回エクスポートするのか、
> エクスポート用のコマンドボタンを配置するのか。
>
>・常に同じ名前で良いのか、C:\2000年.xlsの様にしたいのか。
>
>・同じ名前のファイルがあったらどうするのか。

そうですよね。説明不足ですみません。
・コンボボックスで更新したら、毎回はエクスポートはしませんが、
 エクスポート用のコマンドボタンを配置して、データが欲しい時に
 ボタンを押すといった感じです。

・名前は、名前をつけて保存の様にしたいのです。(自分の好きな名前)

・同じ名前のファイルがあったら、上書きでOKです。

今、違うデータのエクスポートでオブジェクトにこんなマクロを作ったのですが、
名前をつけて保存をしたいのですが、出来ないのです。
別で質問を出そうかと思っていたのですが、これもご一緒の質問でいいですか?
上記の件は、このマクロでは出来ないと思いますので、他で使用したいです。

・アクション=出力
・オブジェクトの種類=フォーム
・オブジェクト名=F_判定日ブランク
・出力ファイル形式=Microsoft Excel (*.xls)
・出力ファイル=D:\UserArea\デスクトップ\判定日付全てブランク.xls
 ↑
 これを、毎回好きな名前にしたいのです。
・自動起動=いいえ

毎度出来の悪い私ですが、どうか、よろしくお願いします。
・ツリー全体表示

【6914】Re:SQL文で構文の誤り
回答  中西 健  - 05/12/5(月) 20:17 -

引用なし
パスワード
    私が間違っていました。
 アスタリスクの付近でシングルアポストロフィーが余分でした。
 下記参照ください。

xSQL10 = "INSERT INTO WT_個別原価管理表 ( 工事番号 ) " & _
     "SELECT T_工事台帳.工事番号 " & _
     "FROM T_工事台帳 LEFT JOIN T_営業所マスタ " & _
     "ON T_工事台帳.工番コード=T_営業所マスタ.工番コード " & _
     "WHERE (((T_工事台帳.営業所コード) Like '*" & Forms!F_Main!営業所コード & "*') " & _
     "And ((T_工事台帳.売上修正損益)='0';"
・ツリー全体表示

【6913】Re:SQL文で構文の誤り
質問  みつ  - 05/12/5(月) 18:14 -

引用なし
パスワード
   長すぎてはっきりしないので短くしました。
以下の場合に演算子がないとのエラーが出るのですが・・・

xSQL10 = "INSERT INTO WT_個別原価管理表 ( 工事番号 ) " & _
     "SELECT T_工事台帳.工事番号 " & _
     "FROM T_工事台帳 LEFT JOIN T_営業所マスタ " & _
     "ON T_工事台帳.工番コード=T_営業所マスタ.工番コード " & _
     "WHERE (((T_工事台帳.営業所コード) Like '*'" & Forms!F_Main!営業所コード & "'*') " & _
     "And ((T_工事台帳.売上修正損益)='0';"
DoCmd.RunSQL xSQL10
・ツリー全体表示

【6912】Re:クエリでマクロを組んだものを、エクス...
発言  小僧  - 05/12/5(月) 18:05 -

引用なし
パスワード
   ▼サチチ さん:
こんばんは。

>こんにちは。小僧さん、またまた教えて下さい。

他の回答者の方が答えにくくなってしまいますよ^^;


>今度は、これをエクスポートしたいのです。

どちらにエクスポートするのでしょうか。
Excelファイル、CSVファイル、テキストファイル等…。
エクスポートする対象によってコードが変わってきますのでご提示して下さい。

あとは「エクスポートするタイミング」や、ファイル名が問題になってきますね。

・コンボボックスを更新したら毎回エクスポートするのか、
 エクスポート用のコマンドボタンを配置するのか。

・常に同じ名前で良いのか、C:\2000年.xlsの様にしたいのか。

・同じ名前のファイルがあったらどうするのか。

等などの情報があると、より的確に回答ができると思います。
・ツリー全体表示

【6911】Re:2年分の検索方法は?
発言  小僧  - 05/12/5(月) 17:51 -

引用なし
パスワード
   ▼わん さん:
こんばんは。

できた事はできたのですが、
「とりあえずできた」程度のモノですので参考までに…。

フォーム:フォーム名
コンボボックス
cmb年
cmb月
cmb名前

テキストボックス(コントロールソース)
txt年(年)
txt月(月)
txt名前(名前)
txt結果1(結果1)
txt結果2(結果2)
txt前年結果1(無し)
txt前年結果2(無し)

フォームのレコードソース

SELECT Year([日付]) AS 年,
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)) AS 月,
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前) AS 名前,
Sum(テーブルI.結果1) AS 結果1,
Sum(テーブルI.結果2) AS 結果2
FROM テーブルI
WHERE (((IIf(IsNull([Forms]![フォーム名]![cmb月]),"---",Month([テーブルI].[日付])))="---" Or
(IIf(IsNull([Forms]![フォーム名]![cmb月]),"---",Month([テーブルI].[日付])))=[Forms]![フォーム名]![cmb月]) AND
((IIf(IsNull([Forms]![フォーム名]![cmb名前]),"---",[テーブルI].[名前]))="---" Or
(IIf(IsNull([Forms]![フォーム名]![cmb名前]),"---",[テーブルI].[名前]))=[Forms]![フォーム名]![cmb名前]))
GROUP BY Year([日付]),
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)),
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前),
IIf(IsNull(Forms!フォーム名!cmb月),"---",Month(テーブルI.日付)),
IIf(IsNull(Forms!フォーム名!cmb名前),"---",テーブルI.名前)
HAVING (((Year([日付]))=[Forms]![フォーム名]![cmb年]));

(コピーペーストでいけると思います…。)


あとは、cmb年、cmb月、cmb名前の更新後処理から
関数を呼び出す形になります。

Private Sub cmb年_AfterUpdate()
  Call LastYear
End Sub

Private Sub cmb月_AfterUpdate()
  Call LastYear
End Sub

Private Sub cmb名前_AfterUpdate()
  Call LastYear
End Sub

Sub LastYear()
Dim strWhere As String

  strWhere = "Year([日付]) = " & CLng(Me.cmb年) - 1
  
  If Not IsNull(Me.cmb月) Then
    strWhere = strWhere & " AND Month([日付]) = " & CLng(Me.cmb月)
  End If
  
  If Not IsNull(Me.cmb名前) Then
    strWhere = strWhere & " AND 名前 = '" & Me.cmb名前 & "'"
  End If
  
  Me.txt前年結果1.value = DSum("結果1", "テーブルI", strWhere)
  Me.txt前年結果2.value = DSum("結果2", "テーブルI", strWhere)
  Me.Requery
End Sub


色々と考えていたのですが、上記の通りまとまったものができなくてすみません。
・ツリー全体表示

【6910】Re:ユニオンクエリについて
お礼    - 05/12/5(月) 17:31 -

引用なし
パスワード
   ▼小僧 さん:
ありがとうございます。
>A) Union ALL する前のクエリの全てに Where句をつける。
A)の方法で対応しました。今まで、Union Allの後にWhere句をつけてました。

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

【6909】Re:ユニオンクエリについて
回答  小僧  - 05/12/5(月) 15:08 -

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

>WHERE句を追加したいのですが、どうしたらよいのでしょうか?

普通の選択クエリであれば、Where句を作れますでしょうか?

A) Union ALL する前のクエリの全てに Where句をつける。

B) サブクエリを使って普通の選択クエリにする。

SELECT P.*
     FROM [
     SELECT 課題番号,案件名,設計受付年月日,
     回答期限年月日,回答実績年月日,"T_003案件検討" AS テーブル名
     FROM T_003案件検討
     UNION ALL
     SELECT 課題番号,案件名,設計受付年月日,
     回答期限年月日,回答実績年月日,"T_004製作移管" AS テーブル名
     FROM T_004製作移管
    ]. AS P

B) についてはAc2000以降ですと、デザインビューが使えますので、
  Where句も作りやすいかと思われます。
・ツリー全体表示

【6908】Re:2年分の検索方法は?
発言  わん  - 05/12/5(月) 15:04 -

引用なし
パスワード
   お世話様です。
まさに小僧さんが示した通りのものを
作成したいと考えています。
詳細に明示して下さりありがとうございます。

>・cmb年 が未選択 : 前年という概念ができないので表示なし。
>・cmb年 を選択 : 年に応じた結果1 の合計と結果2 の合計
>         また、前年の結果1 の合計と結果2 の合計が表示。
>この状態から、cmb月、cmb名前を選択する事によって
>フィルタが掛けられる、という事なのでしょうか?
>
>> テーブルI データ
>>  ID     日付      名前   結果1  結果2
>>   1   2000年1月1日   A    130000  235
>>   2   2000年2月1日   B    180000  285
>>   3   2001年1月1日   A    200000  300
>>   4   2001年2月1日   B    100000  185
>>   5   2002年1月1日   C    170000  275
>>   6   2002年2月1日   C    250000  335
>>   7   2003年1月1日   A    100000  185
>>   8   2004年1月1日   B    150000  260
>>   9   2004年2月1日   C    190000  290
>
>cmb年が未選択 → 表示レコードなし
>
>cmb年 で 2002を選択
>   2002年--月   ---    420000  610  300000  485
>
>cmb月 で 1 月を選択
>   2002年01月   ---    170000  275  200000  300
>
>cmb名前 で C を選択
>   2002年01月   C     170000  275  ------  --- 

できますでしょうか?
宜しくお願いします。
・ツリー全体表示

【6907】Re:5択問題
回答  小僧  - 05/12/5(月) 14:55 -

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

>この5個のデータをフォームに作ったテキストボックス5個に
>それぞれ表示させることがなかなかできません。

連結フォームで行うのでしたら、帳票フォームで実現できると思います。
ですが、見かけ上は 5つのテキストボックスが表示されますが、
実体は 1つのテキストボックスしかない為、多少扱いにくくなります。

非連結フォームで行うためには、AccessVBAにてレコードセットを
使いながらフォームにセットしていく事になります。

フォーム上のテキストボックスの名前を
「txt設問1」「txt設問2」「txt設問3」「txt設問4」「txt設問5」として
フォームの読み込み時に以下のコードを記述されてみて下さい。

Private Sub Form_Load()
'要参照 Microsoft DAO x.x Object Library
Dim RS As DAO.Recordset
Dim QName As String
Dim i As Long

  QName = "Q_設問"  'RND関数を用いてソートしたクエリ名

  Set RS = CurrentDb.OpenRecordset(QName)
    For i = 1 To 5
      Me.Controls("txt設問" & i).Value = RS![設問]
      RS.MoveNext
    Next
  RS.Close: Set RS = Nothing
End Sub
・ツリー全体表示

【6906】Re:2年分の検索方法は?
発言  小僧  - 05/12/5(月) 14:26 -

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

>説明が上手くできなくて申し訳ありません。

すみません、こちらこそです。
未だ わんさん のやりたい事が明確に見えてきません^^;

・cmb年 が未選択 : 前年という概念ができないので表示なし。

・cmb年 を選択 : 年に応じた結果1 の合計と結果2 の合計
         また、前年の結果1 の合計と結果2 の合計が表示。


この状態から、cmb月、cmb名前を選択する事によって
フィルタが掛けられる、という事なのでしょうか?

> テーブルI データ
>  ID     日付      名前   結果1  結果2
>   1   2000年1月1日   A    130000  235
>   2   2000年2月1日   B    180000  285
>   3   2001年1月1日   A    200000  300
>   4   2001年2月1日   B    100000  185
>   5   2002年1月1日   C    170000  275
>   6   2002年2月1日   C    250000  335
>   7   2003年1月1日   A    100000  185
>   8   2004年1月1日   B    150000  260
>   9   2004年2月1日   C    190000  290

cmb年が未選択 → 表示レコードなし

cmb年 で 2002を選択

   2002年--月   ---    420000  610  30000  485

cmb月 で 1 月を選択

   2002年01月   ---    170000  275  200000  300

cmb名前 で C を選択

   2002年01月   C     170000  275  ------  --- 
・ツリー全体表示

【6905】クエリでマクロを組んだものを、エクスポ...
質問  サチチ  - 05/12/5(月) 14:19 -

引用なし
パスワード
   こんにちは。小僧さん、またまた教えて下さい。
以前、2000年と打つと、1年目の所に2000年・2年目に2001年と
でるようなクエリ・フォーム・レポートを作成していただいた
のですが、今度は、これをエクスポートしたいのです。
念のため、今回作っていただいたイベントとSQLをのせます。

クエリのSQL↓ (中身は以前より、少し変更しました)
PARAMETERS [Forms]![管理開始5年].[txt年] Long;
TRANSFORM Count(Q_63分類と17分類のまとめ.ID) AS 人数
SELECT Q_63分類と17分類のまとめ.[17分類], Q_63分類と17分類のまとめ.[17分類名], Q_63分類と17分類のまとめ.63分類, Q_63分類と17分類のまとめ.63分類名
FROM Q_63分類と17分類のまとめ
GROUP BY Q_63分類と17分類のまとめ.[17分類], Q_63分類と17分類のまとめ.[17分類名], Q_63分類と17分類のまとめ.63分類, Q_63分類と17分類のまとめ.63分類名
PIVOT (Left(Q_63分類と17分類のまとめ.管理開始年,4)-Forms!管理開始5年.txt年)+1 & '年目' In ('1年目','2年目','3年目','4年目','5年目');

フォームのイベントプロシージャー
Private Sub txt年_AfterUpdate()
  Me.[Lbl1年目].Caption = Me.txt年 & "年"
  Me.[Lbl2年目].Caption = Me.txt年 + 1 & "年"
  Me.[Lbl3年目].Caption = Me.txt年 + 2 & "年"
  Me.[Lbl4年目].Caption = Me.txt年 + 3 & "年"
  Me.[Lbl5年目].Caption = Me.txt年 + 4 & "年"
  Me.Requery
End Sub

レポートのイベントプロシージャー↓
Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
  Me.Lbl1年目.Caption = Forms![管理開始5年].Lbl1年目.Caption
  Me.Lbl2年目.Caption = Forms![管理開始5年].Lbl2年目.Caption
  Me.Lbl3年目.Caption = Forms![管理開始5年].Lbl3年目.Caption
  Me.Lbl4年目.Caption = Forms![管理開始5年].Lbl4年目.Caption
  Me.Lbl5年目.Caption = Forms![管理開始5年].Lbl5年目.Caption
End Sub


としています。今度はエクスポートをして、1年目の所に2000年・2年目の所に2001年
と出力できるようにしたいのです。

どうか、よろしくご教授願います。
・ツリー全体表示

【6904】ユニオンクエリについて
質問   E-MAIL  - 05/12/5(月) 13:45 -

引用なし
パスワード
   現在下記のようなSQLを用いて、ユニオンクエリを作成しています。
これに、WHERE句を追加したいのですが、どうしたらよいのでしょうか?

WHERE句の条件となるのは、”回答実績日が空白のもの”と”回答実績年月日が回答期限年月日より大きい(過ぎている)”データを抽出する。というものです。

どなたか指導願います。

SELECT 課題番号,案件名,設計受付年月日,回答期限年月日,回答実績年月日,"T_003案件検討" AS テーブル名 FROM T_003案件検討
UNION ALL
SELECT 課題番号,案件名,設計受付年月日,回答期限年月日,回答実績年月日,"T_004製作移管" AS テーブル名 FROM T_004製作移管
UNION ALL;
・ツリー全体表示

【6903】Re:2年分の検索方法は?
発言  わん  - 05/12/5(月) 13:06 -

引用なし
パスワード
   こんにちわ。
いつもお世話になっております。
説明が上手くできなくて申し訳ありません。

ご質問の件ですが、

>2005/12/05 A  10000
>2005/12/06 A  12000
>上記のように同年、同月、同じ名前で結果が2つあるような事はありますか?
あります。

>もしあるとすれば、フォーム上に表示するのは
>1) 合計だけ
>2005/12   A  22000
表示するのはこの状態です。
ですので、全件のデータは表示されてはおりません。

>>現在は、フォーム上のコンボ検索にはcomb年以外にも
>>comb年、comb月、comb名前で検索をして表示させています。
>これはフィルタを使っているのでしょうか。
はい、おっしゃる通りです。
コードは以下のようになっております。(以前に教えて頂いたコードです)

Private Sub cmd検索_Click()
If IsNull(Me.年度) Then
 MsgBox "年度を入力して下さい。"
  Me.年度.SetFocus
  Exit Sub
 End If
If DCount("*", "クエリ", "Left(日付, 4) = '" & Me.年度 & "'") = 0 Then
  MsgBox "選択された年度は存在しません。"
Else
  Me.Filter = "Left(日付, 4) = '" & Me.年度 & "'"
  Me.FilterOn = True
End If
End Sub

ちなみにcmd検索ボタンには年度及び月度、名前用があります。
以上のコードにどう書き加えれば、
前年分がtxt結果1前年に表示されるのでしょうか?
基本的に無理なことなのでしょうか?

以上の説明でご理解頂けたでしょうか。
宜しくお願い致します。
・ツリー全体表示

【6902】5択問題
質問  なお  - 05/12/5(月) 12:37 -

引用なし
パスワード
   初めましてこんにちは。
今、5択問題を作っています。
毎回違う5択問題を作りたかったのでRND関数をクエリに使いました。
そして上から5個を表示させてあります。
この5個のデータをフォームに作ったテキストボックス5個に
それぞれ表示させることがなかなかできません。
VBはどうやって組むといいのでしょうか?
・ツリー全体表示

【6901】Re:SQL文で構文の誤り
回答  中西 健  - 05/12/5(月) 10:14 -

引用なし
パスワード
    " & Forms!F_Main!営業所コード & "とつけたのと同様に、Forms!F_Mainで参照しているところは全部、文字列リテラルの外に出さないといけないです。コードが全角になるのはたぶん問題がないです。
・ツリー全体表示

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