Access VBA質問箱 IV

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

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


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

【8880】Re:日付の比較の方法
回答  Gin_II  - 06/12/7(木) 23:20 -

引用なし
パスワード
   >DATEDIFF(d,"開始日","終了日","D") < 0

引数がおかしいですよね?
DateDiff 関数のヘルプを確認してください。
・ツリー全体表示

【8879】日付の比較の方法
質問  まる  - 06/12/7(木) 18:54 -

引用なし
パスワード
   開始日と終了日を比較し、チェックをしたいと思います。

そこで
sub 日付チェック()
if
DATEDIFF(d,"開始日","終了日","D") < 0
then MsgBox(Prompt:="[開始日の方が後の日付になっています], _
  buttoms:=vbinfomation + vbOkCancel, _
  totle:="日付チェック結果")
END If

と書いてみました。    
しかし、不等式の部分でエラーになります。(赤い文字になります)

どこがいけないのでしょうか?

教えてくださいm(__)m
・ツリー全体表示

【8878】Re:ファイルのインポート
発言  小僧  - 06/12/7(木) 18:04 -

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

>上記のようなことは可能でしょうか?

可能か不可能か、という事でしたら可能です。


ただこういったご質問のされ方ですと、画面上部にある

「本サイトの基本方針をまとめました。こちら をご一読ください。」

に書いてあるの「丸投げ」と思われてしまいますので注意して下さいね^^


さて、実際の方法ですが

1.CSVファイルを開いて
 Openステートメント
 OpenTextFileメソッド

2.1行目を読み込み
 Line Input ステートメント
 ReadLineメソッド
 
3.「,」で分割して
 Split関数

4.ループ処理でインサート文を作成
 For〜Next
 Do〜Loop

の様な処理ステップになるかと思われます。


途中で解らない事がありましたら再度ご質問されてみて下さい。
・ツリー全体表示

【8877】Re:履歴について
発言  小僧  - 06/12/7(木) 17:50 -

引用なし
パスワード
   ▼アイマール さん:
こんにちは。

だんだんと原因は絞られてきた様な気がしませんでしょうか。
次にチェックするのはエラーが起こるテキストボックスと
エラーがおきないテキストボックスで何が違うのか調べてみましょう。

例として…

Option Compare Database
Option Explicit

Sub TextBoxのプロパティをチェック()
Const FName = "該当フォーム名"
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim strSQL As String
Dim FLG As Boolean
Dim ctl As Access.Control
Dim i As Long

  Set DB = CurrentDb
  On Error Resume Next
    DoCmd.DeleteObject acTable, "EX_TableCheck"
  On Error GoTo 0
  
  DoCmd.OpenForm FName, acDesign
  FLG = True
  
  For Each ctl In Forms(FName).Controls
    If ctl.ControlType = acTextBox Then
      If FLG Then
        Call Create_Table(DB, ctl)
        FLG = False
      End If
      Set RS = DB.OpenRecordset("EX_TableCheck", dbOpenDynaset)
        RS.AddNew
          
        For i = 1 To RS.Fields.Count - 1
          On Error Resume Next
          RS(i).Value = ctl.Properties(Mid(RS(i).Name, 3))
          If Err.Number <> 0 Then
            RS(i).Value = "ERROR!!!"
          
          End If
          On Error GoTo 0
        Next
        RS.Update
        RS.Close
    End If
  
  Next
  DoCmd.Close acForm, FName
  Set RS = Nothing
  Set DB = Nothing
End Sub

Function Create_Table(DB As DAO.Database, objText As Access.TextBox)
Dim strSQL As String
Dim strField As String
Dim prp As Object

  For Each prp In objText.Properties
    strField = strField & ", F_" & prp.Name & " TEXT(50)"
  Next

  strSQL = "CREATE TABLE EX_TableCheck(" _
      & "SEQ Counter(1), " _
      & Mid(strField, 2) _
      & ");"

  DB.Execute strSQL, dbFailOnError

End Function


上記の様なコードを標準モジュールに記載し実行した後に
テーブル EX_TableCheck の値を見比べて見ると何か見つかるかもしれません。
(見つからないかも…しれません…。)
・ツリー全体表示

【8876】サブフォームのコントロール可視制御
質問    - 06/12/7(木) 17:37 -

引用なし
パスワード
   メインフォームのテキストボックス(A)の値によって、サブフォームのコントロール(B)の可視を切り替えたいのですが、うまくいきません。何がいけないのでしょうか。

If A.Value = 1 Then
   Forms!メインフォーム!サブフォーム.Form!B.Visible = False
Else
   Forms!メインフォーム!サブフォーム.Form!B.Visible = true
End If

上記では、全く可視を制御できず、変わりに変数の値を変化させて、サブフォームの読み込み時のイベントで可視を切り替えると、2回目以降の読み込み時には制御できるのです。RequeryやRepaintなど、いろいろやってみましたが・・・
どなたか、教えていただけますか。
・ツリー全体表示

【8875】Re:履歴について
質問  アイマール  - 06/12/7(木) 16:53 -

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

Print ctl.Name で試した結果、以下の通りになりました。
エラーは、ほとんどテキストボックスからエラーが出ておりました。

姓、名など、エラーが出ていないテキストボックスと、緊急連絡先、住所、などエラーが
出ているテキストボックスがあるそうです。
ちなみにコンボボックスはエラーがありませんでした。

エラーが出ているテキストボックスを全て削除し、エラーが出てないテキストボックスと
コンボボックスだけ残して、編集してみると、フィールド名もきちんと表示され、うまく行きました。

いったい、どうなっているのでしょうか。。。。
・ツリー全体表示

【8874】ファイルのインポート
質問  こうへい  - 06/12/7(木) 16:39 -

引用なし
パスワード
   CSVファイルの取り込みで、質問があります。
CSVファイルのレイアウトは以下のようなものです。

得意先CD,実績,実績,実績,実績,実績,実績,実績

キー項目に対して実績が7回繰り返しで入っています。
実績は前期の実績で7回目のは合計値です。

これを以下のように変換したいと考えています。
得意先CD,年月,実績
得意先CD,年月,実績
得意先CD,年月,実績



最初はCSVをインポートしてからクエリででもやろうと思っていたのですが、
項目数が多すぎて(400くらい)ちゃんとインポートできませんでした。

そこでVBAで、
・CSVファイルを1行読み込む
・インサート文を作成し、インサート×6
※合計値はいらない

ということをやろうと思ったのですが、
手元に資料が無く、こういうことができるのかも
わからない状態です。

上記のようなことは可能でしょうか?
宜しくお願いいたします。
・ツリー全体表示

【8873】Re:履歴について
発言  小僧  - 06/12/7(木) 16:16 -

引用なし
パスワード
   ▼アイマール さん:
こんにちは。

>> エラー発生時において、ctl という変数の中には
>> どのコントロールが入っているのでしょうか。
>
>あるクエリを元に貼り付けたコントロールの種類は「テキストボックス」、「コンボボックス」、
>「チェックボックス」の3つのみです。
>したがって、ctlの変数には上の3つのコントロールが入っていると思いますが、如何でしょうか。

デバッグの仕方はご存知ですか?
エラーが出た状態でイミディエイトウィンドウ
(デフォルトの状態ですと ctrl + G を押すと起動されます)にて

? ctl.Name

と入力しEnterキーを押し、
どのコントロールでエラーが発生しているかを確実にしてみましょう。


当方も色々と試してみたのですが、
どうやらオプショングループの中にあるチェックボックスにおいては
OldValue や Value の値が取れないようですね。
・ツリー全体表示

【8872】Re:履歴について
質問  アイマール  - 06/12/7(木) 15:48 -

引用なし
パスワード
   確かにおっしゃる通りです。
分かりやすい変数名に変更させて頂きました。
Dim ctl As Control
Dim ctl_FieldName As Variant

>Dim ctl As Access.Textbox
ではなく、

Dim ctl As Control

と宣言しております

> ctl.ControlType = acComboBox Then
> という記述で何かおかしいな…と気づく訳です。

If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acCheckBox Then
と記述して、見た感じは間違いはないように感じます。(チェックボックスが漏れていました)
ctl As Control と宣言しているんですが、どこに間違いがあるのでしょうか・・・。

テキストボックスのみ編集した場合もあれば、テキストボックスとチェックボックスを編集した場合もあれば、
コンボボックスのみ編集する場合もあります。それぞれです。

> エラー発生時において、ctl という変数の中には
> どのコントロールが入っているのでしょうか。

あるクエリを元に貼り付けたコントロールの種類は「テキストボックス」、「コンボボックス」、
「チェックボックス」の3つのみです。
したがって、ctlの変数には上の3つのコントロールが入っていると思いますが、如何でしょうか。


下記プログラムで試しても、If Nz(ctl.OldValue) <> Nz(ctl.Value) Thenで
エラーが起きてしまいます。
テキストボックスのみ編集した場合は何故か、問題ありませんが、両方を編集した場合は、
エラーが起きてしまいます。

------------------------------------------------------
Dim ctl As Control
Dim ctl_FieldName As Variant
  
ctl_FieldName = Null 'Variantなので、初期値Null
'コントロール名(フィールド名)の取得
For Each ctl In Me.Controls
'コントロールがテキストボックスである
 If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acCheckBox Then
  '更新前データと更新後データを比較
  If Nz(ctl.OldValue) <> Nz(ctl.Value) Then
   'コントロール名をctl_FieldName に格納
   If IsNull(ctl_FieldName) Then
    ctl_FieldName = ctl.Name
   Else
    ctl_FieldName = ctl_FieldName & "," & Chr(32) & Chr(32) & ctl.Name
   End If
  End If
 End If
Next ctl
MsgBox ctl_FieldName
・ツリー全体表示

【8871】Re:履歴について
発言  小僧  - 06/12/7(木) 14:42 -

引用なし
パスワード
   ▼アイマール さん:
こんにちは。

まず…他人に見せるプログラムなのですから
最低限の読みやすさは考慮しましょうね。

宣言部は提示していない、
また「ctlTextbox」という変数名から

Dim ctlTextbox As Access.Textbox

という宣言が隠れていると推測するのが普通だと思われます。
その後の

> ctlTextbox.ControlType = acComboBox Then


という記述で何かおかしいな…と気づく訳です。

どこかのサイトを参考にしてアイマールさんなりに
試行錯誤したプログラムなのかもしれませんが、
他人に見てもらうからには推測しやすい変数名にするか
変数の宣言部分を提示するかをしないと適切な回答が得られませんよ^^


さて、本題なのですが

エラー発生時において、ctlTextbox という変数の中には
どのコントロールが入っているのでしょうか。
ControlType プロパティがないコントロールというのは余り聞いた事がないですね。
もし、

> If Nz(ctlTextbox.OldValue) <> Nz(ctlTextbox.Value) Then

の行でエラーが発生している、という事でしたら
OldValueプロパティ や Value プロパティを持っていない
コントロールによってエラーが出ていると推測できるのですが…。
・ツリー全体表示

【8870】Re:コンボボックスで条件をつけたSQLでの...
回答  たん  - 06/12/7(木) 11:17 -

引用なし
パスワード
   基本機能だけで出来そうな内容を、無理矢理、難しい方法でやろうと
しているように見えるのは気のせいでしょうか?

>今回、AccessVBAを使って一覧表を"見るだけ"の機能
>(出力されたデータをここで触る事はありません。)を作ろうとしています。

サブフォーム(〜〜の許可プロパティを全ていいえ)にしたものを
表示させれば済むレベルだと思いますが。

色変更は、条件付書式で済むかと。

まあ、元テーブルの時点で、データベースで用いるには
相応しくない形式なのが一番の問題のように思えます。

>【データのあるテーブル(TBL_datex)】
> [区分]エリア1:1、エリア2:2 (名称:コード番号)
> [名前]A:1、B:2、C:3、D:4、 (名称:コード番号)
> [アイテム]01、02・・・32、33
> [年月日]yyyymmdd

を、区分、名前、アイテムNo.、アイテム件数、年月日
のような構成のテーブルにして、
列見出しを設定したクエリにするのが妥当な気がします。
・ツリー全体表示

【8869】コンボボックスで条件をつけたSQLでの転記
質問  浅川  - 06/12/6(水) 21:53 -

引用なし
パスワード
   --------------------------------------------
 winXP/Access 2003/Spread Sheet 10.0 使用
※VB6.0とExcelVBAを少し触った事があります。
--------------------------------------------

今回、AccessVBAを使って一覧表を"見るだけ"の機能
(出力されたデータをここで触る事はありません。)を作ろうとしています。

■機能概要等
コンボボックスで"区分"、"年"、"月"を選択してコマンドボタンを押すと
選択された条件に一致した内容(件数)をスプレッドシートに表示させます。

スプレッドシートの行・列の項目は「画像」になっていて、
実際スプレッドで作ってる部分は内容のみです。
#データを表示させるのに作りやすいかなと思いそういう形にしました。


■データ等について
【スプレッドシートの表示の仕方】

 | 1 2 3 ・・・・  29 30 31  ←日付(本当は画像)
―+―――――――――――――――
A | 0| 0| 0 ・・・・  2| 1| 1|
B | 1| 3| 1 ・・・・  3| 0| 4|
C | 0| 6| 0 ・・・・  2| 1| 1|  ←件数を表示(ここだけデータ)
D | 9| 0| 0 ・・・・  2| 1| 5|   

↑名前(本当は画像)

【フォーム1にある物】
コンボボックス1(cbo_Kubun) ・・・区分が選択できる。
コンボボックス2(cbo_Year)  ・・・年が西暦で選択できる。
コンボボックス3(cbo_Month) ・・・月が選択できる。
コマンドボタン(cmd_Go)
スプレッドシート(ssDate)

【データのあるテーブル(TBL_datex)】
 [区分]エリア1:1、エリア2:2 (名称:コード番号)
 [名前]A:1、B:2、C:3、D:4、 (名称:コード番号)
 [アイテム]01、02・・・32、33
 [年月日]yyyymmdd

※区分〜アイテムまではテキスト型、年月日は日付型です。
※件数は大体1000件位。固定ではありません。

・・・大体の作りは上記の情報で作ってあります。


■テーブルのデータについて
例えば
「エリア1で2001年11月02日にAの01を取得した。」
・・・・という情報があったら
------------------------------------------
[区分][名前][アイテム][年月日]
 1   1     01  2001/11/02
------------------------------------------
という形でテーブルに登録されているものとします。

そしてこのデータを、
「いつの年・月で、どの区分のアイテムが日別で何件あるか」
を出したいと思います。

区分・年・月はコンボボックスからデータを取得し、
SQL文で対象データを絞る形です。※DAOを用いています。

[エリア1]選択時では[名前]A〜Dの件数を、
[エリア2]選択時では[名前]A〜Cまでの件数を表示させます。
後者の時、エリア2のDの行はHeight=0にして隠しています。

出力したデータを最終的には
件数が33(アイテムが日で33個揃ってる状態)の時スプレッドシートの背景が青
1件〜32件までの時は背景が赤、0件の時は白、と色をつけたいです。

-----------------

やりたい事、といいますかお聞きしたい事は
テーブル(TBL_datex)から値を拾い横方向へデータを埋めていく部分の作り方です。

ループで1件ずつ処理してくと考えてみたので、
その中で背景の色を一緒に切り替える部分も作りたいです。


考えてみたコードですが、
///////////////////////////////////////////////////

Private Function mblnCreateWorkTable()

dim Kubun As String
dim YearDay As String
dim strSQL as String

Kubun = cbo_kubun
YearDay = cbo_Year & cbo_Month

-ループ ここから

[1] strSQL = "SELECT TBL_datex.名前,TBL_datex.年月日, Count(TBL_datex.年月日) AS カウント" & _
    "FROM TBL_datex" & _
    "WHERE (((TBL_datex.区分)=" & Kubun & ") AND ((TBL_datex.年月日)=" & YearDay & "))" & _
    "GROUP BY TBL_datex.名前, TBL_datex.年月日, TBL_datex.区分" & _
   "ORDER BY TBL_datex.名前;"

[2] countで出た値(件数)を横向きにセルに転記する。
    ssDate.Range([名前],mid([年月日],7,2)).Value = 件数
  
[3] If 件数=33 Then
   ssDate.セル番号.Interior.ColorIndex = 青
    Else if 件数=0 then
     ssDate.セル番号..Interior.ColorIndex = 白
    Else  '1〜32件の部分↓
     ssDate.セル番号..Interior.ColorIndex = 赤
  End If

-ループ ここまで


Exit Function
///////////////////////////////////////////////////

と、解る部分やネット等で調べて作れた部分だけコード化したので実行する事ができません。

[1]で取れたデータを、[2]の位置で転記し、[3]で件数によって色を変えたいのですが、
これらを一連の流れでコードしたいので、どなたかご教授願います。


また、セル番地の値は、[名前]の1〜3と、年月日の日付1〜31で取得できると思うのですが、
この方法でセル番地を決める方法ではあまり良くないのでしょうか?
 ※試しに、転記の部分で適当な値を入れ実行してみたのですが、
  シートに値が挿入されずエラーも起きていないようでした。

以上です。
・ツリー全体表示

【8868】履歴について
質問  アイマール  - 06/12/6(水) 19:30 -

引用なし
パスワード
   Q_住所(クエリ)を元に作成したフォームがあり、そのフォームには、
「姓」、「名」、「No_組織」、「No_テスト」など、各フィールドを
貼っています。

◇テキストボックス:「姓」、「名」、その他・・・
◇コンボボックス:「No_組織」、「No_テスト」、その他・・・

それらのコントロールにて、何かを編集したら、編集前のレコードを、
履歴用テーブルに記録したい。
つまり、Q_住所のレコードを、履歴用テーブルに記録する。

<目的>
ただし、どの"フィールド"を修正したか、フィールド名も記録するため、
編集前のフィールドと編集後のフィールドを比較したい。

<エラー>
テキストボックスとコンボボックスを貼っている場合、両方を編集したら
何故かエラーが出ます。
尚、何故か、テキストボックスのみ編集した場合はエラーは起きませんでした。
何か足りない部分がありますでしょうか??

ctl_Nameにて、編集したフィールド名を格納するものとし、
MsgBox ctl_Name にて、編集したフィールド名を確認しています。


下記、プログラムの、
    If ctlTextbox.ControlType = acTextBox Or ctlTextbox.ControlType = acComboBox Then
の部分で、
「この操作は、このタイプのオブジェクトには実行できません」とエラーが起きてしまいます。
何故、このような現象が起きるか分かりませんので、教えて下さい。
(過去ログも見ましたが、それらしきものは見つかりませんでした)

「姓」、「名」のみ編集した場合は、何もエラーが起きず、姓, 名 と
記録されますが、コンボボックス「姓」、「No_組織」を編集した場合は、
上記のようなエラーが出てしまいます。

--------------処理プログラム----------------------------
  ctl_Name = Null 'Variantなので、初期値Null
  'コントロール名(フィールド名)の取得
  For Each ctlTextbox In Me.Controls
    'コントロールがテキストボックスとコンボボックスである
    If ctlTextbox.ControlType = acTextBox Or ctlTextbox.ControlType = acComboBox Then
      '更新前データと更新後データを比較
      If Nz(ctlTextbox.OldValue) <> Nz(ctlTextbox.Value) Then
        'コントロール名をctl_Name に格納
        If IsNull(ctl_Name) Then 'ctl_Nameが空白の場合
          ctl_Name = ctlTextbox.Name
          'ctl_Name = ControlsSorce.Name '意味不明なプログラム記述
        Else
          ctl_Name = ctl_Name & "," & Chr(32) & Chr(32) & ctlTextbox.Name
        End If
      End If
    End If
  Next ctlTextbox
  MsgBox ctl_Name
・ツリー全体表示

【8867】Re:集計の仕方を教えてください
質問  M  - 06/12/6(水) 15:45 -

引用なし
パスワード
   ▼Gin_II さん:
>新規mdbファイルを作成して、すべてのオブジェクトをインポートしても
>同じような症状が発生しますか?

ご回答ありがとうございます。
新規mdbファイルを作成してテーブルをインポートしてみましたが、
同じ症状が発生してしまいました。
他の人のPCで試してみましたが、やはり同じ結果でした。
・ツリー全体表示

【8866】Re:レポート サブフォーム表示行指定
お礼  ひめ  - 06/12/1(金) 14:42 -

引用なし
パスワード
   ありがとうございます!無事に解決しました!
・ツリー全体表示

【8865】Re:集計の仕方を教えてください
回答  Gin_II  - 06/12/1(金) 12:33 -

引用なし
パスワード
   >問題が発生したため、Microsoft Access を終了します。

新規mdbファイルを作成して、すべてのオブジェクトをインポートしても
同じような症状が発生しますか?
・ツリー全体表示

【8863】Re:レポート サブフォーム表示行指定
回答    - 06/12/1(金) 11:02 -

引用なし
パスワード
   こんにちわ。雅です。

>もしレポート上のサブフォームで最新の5行のみを表示する等出来れば一番
>ベストですが…。

そのサブレポートのレコードソースで5行のみ取得するようにしてはどうですか?
SELECT TOP(5) 〜

でわ。
・ツリー全体表示

【8862】レポート サブフォーム表示行指定
質問  ひめ  - 06/12/1(金) 10:30 -

引用なし
パスワード
   レポートにサブフォームを入れているのですが、そのサブフォームの履歴が
すごい数があり、どうしても1枚におさまりません。
クエリで日付指定をしたものを作ったりしてやってみましたが、そうすると
次ページに行く度に、日付指定をするパラメータが出てしまいます。
もしレポート上のサブフォームで最新の5行のみを表示する等出来れば一番
ベストですが…。
もしくはパラメーターが一度だけですむ日付指定が出来ればと思っています。
(※ちなみに試した方法はクエリで >=[yyyy/mm/dd]でやってみました)

出来るのであればやり方を教えてください!
・ツリー全体表示

【8861】Re:条件式の書き方
お礼  あおぎん  - 06/11/30(木) 8:29 -

引用なし
パスワード
   ▼飛ばない豚 さん:

おはようございます。
回答ありがとうございました!
・ツリー全体表示

【8860】Re:集計の仕方を教えてください
質問  M  - 06/11/29(水) 17:54 -

引用なし
パスワード
   すみません。
エラーメッセージは
問題が発生したため、Microsoft Access を終了します。 ご不便をおかけして申し訳ありません。

参照というところに
AppName: msaccess.exe     AppVer: 10.0.4302.0     ModName: mso.dll
ModVer: 10.0.4219.0     Offset: 00007897

となっています。

[]が変わったりすることがあるんですね。気をつけます。
ただ今回は保存すること自体ができないんです。。
(表示はできました。)
・ツリー全体表示

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