Access VBA質問箱 IV

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

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


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

【12865】名簿のチェックボックス
質問  初心者  - 15/7/4(土) 13:59 -

引用なし
パスワード
   初めて質問させていただきます。
今ACCESSで名簿を作っているのですが、
登録フォームを作成し、所持資格をチェックボックスで選択後
登録ボタンを押すと反映するようにしたいのですが
チェックボックスの内容がうまく取り込めません
どなたか教えていただけないでしょうか?
・ツリー全体表示

【12864】Re:テーブルに存在する単語を1レコードず...
回答  かるびの  - 15/7/4(土) 0:17 -

引用なし
パスワード
   >その際、テーブルBに存在する顧客名を一度に抽出条件として指定するのではなく、
>1顧客ごとにクエリを実行し、Excelファイル出力時も
>1顧客ごとにシートを分割して出力したいのですが、
>そのようなことは可能でしょうか。

 可能だと思います。


 その方法ですが、テーブルBのレコードセットを取得し、それをループさせます。
 各ループにおいて、第1に、テーブルBのレコードセットから顧客名を取得します。
 第2に、取得した顧客名を抽出条件としてテーブルAからレコードを抽出するクエリのレコードセット(rsA)を取得します。
 第3に、rsAをエクセルに展開します。
 これに当たっては、エクセルのCellプロパティを使ったり、
エクセルのCopyFromRecordsetメソッドを使います。


 なお、エクセルへの出力に当たって、TransferSpreadsheetメソッドやOutPutToメソッドが
使えるかと思いましたが、
これらメソッドでは、出力先のワークシートを指定したり、出力先のセル範囲を指定したりは
できないみたいですので、いずれも使えなさそうです。


 ところで、テーブルAのテーブル構成がまずいですね。
 テーブルAに顧客名フィールドが設けられていますが、
顧客名フィールドはテーブルBに既に設けられているので、
テーブルAに顧客名フィールドを持たせてはいけません(一事実一箇所の原則)。
 テーブルAには、顧客名フィールドに代えて、
テーブルBの連番フィールドと同じ値を持つフィールドを設けなければいけません。
・ツリー全体表示

【12863】テーブルに存在する単語を1レコードずつ...
質問  ゆう  - 15/7/3(金) 16:47 -

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

テーブル作成クエリを利用して、
下記テーブルAから、顧客名を抽出条件として
テーブルを作成→Excelファイルに出力したいと考えています。

その際、テーブルBに存在する顧客名を一度に抽出条件として指定するのではなく、
1顧客ごとにクエリを実行し、Excelファイル出力時も
1顧客ごとにシートを分割して出力したいのですが、
そのようなことは可能でしょうか。

いろいろ検索してみたのですが、
ソースコードの書き方がわかりません。
お手数をおかけして恐縮ですが、ご指導よろしくお願いします。


【テーブルA】
 顧客名:テキスト 
 購入商品:テキスト
 購入単価:数値
 各種指標:数値
 
【テーブルB】
 連番:オートナンバー
 顧客名:テキスト
・ツリー全体表示

【12862】Re:3061または94のエラーについて
お礼  さっちも  - 15/7/3(金) 15:38 -

引用なし
パスワード
   さっちもです。

かるびのさん、ご返信ありがとうございました。

以下、インラインで回答致します。

▼かるびの さん:
>>エラー番号3061または94のエラーが発生します。
> 両者は、全然違うタイプのエラーみたいなんですが、
>それぞれエラーメッセージはどんなものですか。
>
>
> OpenRecordsetメソッドでエラーになったときは、SQL文を確認するのが常道です。
> ことに、SQL文を変数に格納しているときはなおさらです。
>
> OpenRecordsetメソッドを実行するコードの直前に
>   Debug.Print SQL_Txt
>というコードを臨時に挿入した上で、コードを実行し、
>エラーになったあと、VBEのウィンドウでイミディエイトウィンドウを開いて、
>SQL_Txt 変数に何が格納されているか確認してみてください。

やはりそれしか方法はないですかね・・。
とりあえず処理に問題がないと思うので、わかっている
エラーコードをキャッチした場合は、空のStringを返却するように
修正して当面はしのごうと思っています。

>
> ところで、
>getDataFromDB 関数の Sql_keyidvalue 引数と WantToGet_item 引数は、なぜ Variant 型にしているのでしょうか。
> いずれの引数もSQL文の一部になるわけですから、String 型とすべきではないでしょうか。
> また、SQL_Txt 変数をなぜ Variant 型にしているのでしょうか。

こちらは、呼び出す元から指定される変数(これは結局、Sql_keyidvalueだけでした)がIntegerの場合があるためです。

たしかに、WantToGet_item、Sql_keyid、SQL_Txt はString型にすべきですね。

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

【12861】Re:3061または94のエラーについて
回答  かるびの  - 15/7/3(金) 0:07 -

引用なし
パスワード
   >エラー番号3061または94のエラーが発生します。
 両者は、全然違うタイプのエラーみたいなんですが、
それぞれエラーメッセージはどんなものですか。


 OpenRecordsetメソッドでエラーになったときは、SQL文を確認するのが常道です。
 ことに、SQL文を変数に格納しているときはなおさらです。

 OpenRecordsetメソッドを実行するコードの直前に
   Debug.Print SQL_Txt
というコードを臨時に挿入した上で、コードを実行し、
エラーになったあと、VBEのウィンドウでイミディエイトウィンドウを開いて、
SQL_Txt 変数に何が格納されているか確認してみてください。


 ところで、
getDataFromDB 関数の Sql_keyidvalue 引数と WantToGet_item 引数は、なぜ Variant 型にしているのでしょうか。
 いずれの引数もSQL文の一部になるわけですから、String 型とすべきではないでしょうか。

 また、SQL_Txt 変数をなぜ Variant 型にしているのでしょうか。
・ツリー全体表示

【12860】3061または94のエラーについて
質問  さっちも  - 15/7/2(木) 18:15 -

引用なし
パスワード
   はじめまして。

現在、以下のような関数を作成しているのですが、Nullの入ったフィールド値をSQL文で読みだそうとすると、「Set R1 = DB.OpenRecordset(SQL_Txt)」のところで、エラー番号3061または94のエラーが発生します。

いろいろ調べてみたのですが、原因と修正方法がわかりません。

■関数の概要:
 指定したテーブル名、キーフィールド名とキー値から、指定したフィールドの値を取得する。

SQL文の例:
 SELECT 名前 AS A FROM テーブル1 WHERE テーブル1.ID=13


ご教授いただければと思います。

よろしくお願いします。


================================
Function getDataFromDB(ByVal Sql_table As String, ByVal Sql_keyid As String, ByVal Sql_keyidvalue As Variant, ByVal WantToGet_item As Variant)

  Dim SQL_Txt, A, B As String
  
If Sql_keyid = "ID" Or Sql_keyid = "管理番号" Then
    SQL_Txt = "SELECT " & WantToGet_item & " AS A FROM " & Sql_table & " WHERE " & Sql_table & "." & Sql_keyid & "=" & Mid(Str(Sql_keyidvalue), 2)
  Else
    SQL_Txt = "SELECT " & WantToGet_item & " AS A FROM " & Sql_table & " WHERE " & Sql_table & "." & Sql_keyid & "='" & Sql_keyidvalue & "'"
End If


On Error GoTo Err:

  Dim DB As DAO.Database
  Dim R1 As DAO.Recordset

  Set DB = CurrentDb()
  Set R1 = DB.OpenRecordset(SQL_Txt) ★ここでエラー発生★
  B = R1!A
  R1.Close
    Set R1 = Nothing
  DB.Close
    Set DB = Nothing

  getDataFromDB = B
  Exit Function

Err:

  Call goError("DBエラー(getDataFromDB)", SQL_Txt)
  
End Function
・ツリー全体表示

【12859】Re:グループのページ数
発言  bbk  - 15/7/2(木) 13:24 -

引用なし
パスワード
   自分で少し触っていたところ
下記のような感じでなんとか表現できました。

グループフッター1に
テキストボックスを配置してコントロースソースに
「=Futta()」を設定しています。


Dim flg As Integer
Dim pagesu As Integer
Dim brk As Variant

Private Sub Report_Open(Cancel As Integer)
  Me.改ページ.Visible = False
End Sub

Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
  If Me.pages <> 0 Then
    Me.改ページ.Visible = (pagesu Mod 2 = 1)
  End If
End Sub

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
  pagesu = pagesu + 1
  If Me.区分コード.Value <> brk Then
    pagesu = 1
    brk = Me.区分コード.Value
  End If
  If Me.pages > 0 Then
    If Me.改ページ.Visible Then
      Me.改ページ.Visible = False
      If flg = 1 And (pagesu Mod 2 = 0) Then
        Cancel = True
        Me.ページフッターセクション.Visible = False
      End If
    Else
      Me.ページフッターセクション.Visible = True
    End If
    Me.ページ = pagesu
  End If
  flg = 0
End Sub

Function Futta()
  flg = 1
End Function
・ツリー全体表示

【12858】クエリーのプロパティ変更
質問  mausu  - 15/7/1(水) 18:42 -

引用なし
パスワード
   ADO でクエリーのプロパティ ReturnsRecords を False にしたい


Insert, Update のパススルークエリーを作成したいのですが
ReturnsRecords を False にしないといけないようで
・ツリー全体表示

【12857】Re:グループのページ数
質問  bbk  - 15/7/1(水) 12:20 -

引用なし
パスワード
   すみません
グループ化して両面印刷するときに、
グループ毎に分けて出力する時も

同じような処理になるのでしょうか?
よろしくお願い致します。
・ツリー全体表示

【12856】Re:グループのページ数
お礼  bbk  - 15/6/25(木) 9:04 -

引用なし
パスワード
   hatenaさま

早速のご回答ありがとうございました。
おかげさまで問題が解決しました。
・ツリー全体表示

【12855】Re:グループのページ数
回答  hatena  - 15/6/24(水) 9:13 -

引用なし
パスワード
   ▼bbk さん:
>グループ別で2ページあるところが、1ページ目は詳細の件数を表示しきって
>終了(ページ表示は 1/1)。2ページはグループフッターから始まる(ページ表示は1/2)・・・となった時にそのグループが2ページあると認識しなくて困っている、、、と感じです。

そのプログ発行人のhatenaです。

ご指摘の不具合は認識してました。
グループ毎ページ数をグループフッターでリセットしてますが、それが原因です。

手元のサンプルでは、レポートモジュールを下記のように修正して対策してましたが、
プログの方は修正するのを失念してました。

Option Compare Database
Option Explicit
Dim d As Object  ' Dictionary オブジェクト用変数
Dim brk As Variant

Private Sub Report_Open(Cancel As Integer)
  Set d = CreateObject("Scripting.Dictionary")
End Sub

Private Sub グループフッター2_Format(Cancel As Integer, FormatCount As Integer)
  If Me.Pages = 0 Then
    d(Me.区分コード.Value) = Me.Page
  End If
End Sub

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
  If Me.区分コード.Value <> brk Then
    Me.Page = 1
    brk = Me.区分コード.Value
  End If
  If Me.Pages > 0 Then
    Me.txtGrpPages = Me.Page & "/" & d(Me.区分コード.Value) & "ページ"
  End If
End Sub


ページヘッダーで、グループフィールドの値が変化したかどうかをチェックしてリセットするよう変更しました。
・ツリー全体表示

【12854】Re:文字列操作について
お礼  まゆり  - 15/6/23(火) 14:25 -

引用なし
パスワード
   ▼かるびの さん:
> 時間が取れないので、簡略な回答です。

限られた時間の中でのご回答ありがとうございます。

非常にわかりやすく、提示頂いた内容でやってみようと思います。
遅くなるかもしれませんが、結果報告致します。

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

【12853】Re:文字列操作について
回答  かるびの  - 15/6/23(火) 14:19 -

引用なし
パスワード
    時間が取れないので、簡略な回答です。


 次の手順のユーザー定義関数を作り、当該関数をクエリの演算フィールドに設定するか、
又はクエリに演算フィールドを設け、次の手順を内容とする式を設定します。

 手順ですが、

 右はしのスペースをRTrim関数で除去。

 Instr関数を使って、1つ目のスペースの位置及び2つ目のスペースの位置を取得。
 これによって、最大3つある文字列がいくつあるかわかるし、
最大3つ文字列のうち、いくつめまでの文字列を取り出すかがわかる。

 IIF関数かSwitch関数を使って、条件分岐を行う。

 Left関数を使って、必要な部分を切り出す。


 でも、式だけで行おうとすると、同じ関数を何度も書かなければならなくなって、
かなり鬱陶しそう。
・ツリー全体表示

【12852】グループのページ数
質問  bbk  - 15/6/23(火) 13:58 -

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

レポートでグループごとのページ数とページを表示する
仕組みを作りたいのですが、hatenaさんのサイト等を参考に
いろいろ試していますが思ったとおりの表現ができません。
皆様のご意見とアドバイスをお願いいたします。

概要
----------------------
ページヘッダー
〜文字列〜   [ページ数表示]
グループヘッダー
詳細
〜各種項目〜
グループフッター 改ページ:カレントセクションの後
〜項目の合計等〜
----------------------

上記のような感じのレポートなのですが
グループ別で2ページあるところが、1ページ目は詳細の件数を表示しきって
終了(ページ表示は 1/1)。2ページはグループフッターから始まる(ページ表示は1/2)・・・となった時にそのグループが2ページあると認識しなくて困っている、、、と感じです。
よろしくお願いします。
・ツリー全体表示

【12851】文字列操作について
質問  まゆり  - 15/6/23(火) 10:59 -

引用なし
パスワード
   題名について、質問させて頂きます。

1つのセルに最大3つの文字列がスペース(_と表示)を挟んで入ってます。

aaaaa_bbbbb_ccccc__
aaaaa_bbbbb__
aaaaa__

抽出したい文字列は3つの文字列の場合は、aaaaabbbbbを、
         2つの文字列の場合は、aaaaaを、
         1つの文字列の場合は、aaaaaを、
取り出したいです。

ちなみに最後のスペースに関しては、ランダムです。
あったりなかったり、1つだったり、2つだったり。

最終的にやりたいことは、クエリの式で作成したフィールド同士
を主キーとしてつなげたいのです。
・ツリー全体表示

【12850】Re:エクセルへの追記
発言  せい  - 15/6/18(木) 22:47 -

引用なし
パスワード
   ▼せい さん:
>ちょっと変更して
>> i = .Range("A6000").End(xlup).Rowにしてもだめだした
Usedrangeで解決しました
・ツリー全体表示

【12849】Re:エクセルへの追記
発言  せい  - 15/6/17(水) 22:03 -

引用なし
パスワード
   ちょっと変更して
> i = .Range("A6000").End(xlup).Rowにしてもだめだした
・ツリー全体表示

【12848】エクセルへの追記
質問  せい  - 15/6/17(水) 18:14 -

引用なし
パスワード
   アクセスで作成したテーブルの内容をエクセルに転記したく
コードを作製したのですが i= のところで
アプリケーション定義または〜とエラーが出てしまいます
一行ずつ実行するとiの部分が0のまま変わらず最終行を示さないようです
エクセルは1行目にオーダーNOとかが入っています
データが無い行から追加していくようにしたいのですが
うまくいきません
End(2)とすると2行目から追記していくので全体的には
あっているとおもうのですが

Private Sub コマンドMC_Click()
On Error GoTo Err_コマンドMC_Click

Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim appExcel As Object
Dim Worksheets As Object
Dim i As Integer

Set DB = CurrentDb
Set RS = CurrentDb.OpenRecordset("照合一覧")

Set appExcel = GetObject("\\192.168.3.199\管理\受注管理\日程管理表.xls")
Set Worksheets = appExcel.Worksheets("加工未定") 'ワークシート名

appExcel.Parent.Windows(appExcel.Name).Visible = False

With Worksheets

i = .Range("A1").End(xlDown).Row + 1 ・・・ここでエラー


RS.MoveFirst

Do Until RS.EOF = True
.Cells(i, 1) = RS.Fields("オーダーNo")
.Cells(i, 2) = RS.Fields("品番図番")
.Cells(i, 3) = RS.Fields("品名")
'.Cells(i, 4) = RS.Fields(" ")
.Cells(i, 5) = RS.Fields("発注残数")
.Cells(i, 6) = RS.Fields("納期")


RS.MoveNext
i = i + 1
Loop

.Cells.Columns.AutoFit
.Range("F:F").NumberFormatLocal = "MM/DD"
.Range("A:A").NumberFormatLocal = "@"

End With

appExcel.Parent.Windows(appExcel.Name).Visible = True

appExcel.Close True

Set Worksheets = Nothing
Set appExcel = Nothing

MsgBox ("エクセルへの出力が終了しました")


Exit_コマンドMC_Click:
  Exit Sub

Err_コマンドMC_Click:
  MsgBox Err.Description
  Resume Exit_コマンドMC_Click

End Sub
・ツリー全体表示

【12847】AccessのフォームからWordの指定箇所へ差...
質問  たくらい  - 15/6/3(水) 16:50 -

引用なし
パスワード
   ACCESSフォームで入力したデータを、作成されたワードの指定箇所ごとにデータを差し込みたいのですが、行き詰っております。

既存のワードを開くことは出来ましたが、ワードの指定場所ごとにデータを差し込む方法が分からなく困っております。

Accessレポートからワードに変換の方法もやってみましたが、罫線が表示されず困っております。

ご教授、宜しくお願いします。


Private Sub wold_Click()

Dim passadd
DoCmd.SetWarnings False
DoCmd.OpenForm "f申請"
passadd = "C:\users\tsun2804\Desktop\申請様式1"
Shell "C:\Program Files\Microsoft Office\Office14\WINWORD " & passadd & "", 3
DoCmd.SetWarnings True
End Sub
・ツリー全体表示

【12846】Re:Dcountの条件にテーブル
お礼  せい  - 15/6/3(水) 9:35 -

引用なし
パスワード
   かるびの 様

ありがとうございます
ネットでは当たり前のように*が紹介されていますね
まちがいではないのかもしれないですけど
今回のようにダメなときがあると知ったことも私にとっては
良かったと感じてます

今回のソフトはいろんな人が機能を付け加えてほしいと要望が出てくるので
また、質問するかもしれませんがその時はお願いします
・ツリー全体表示

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