Access VBA質問箱 IV

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

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


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

【8495】Re:価格更新について
質問  TB1  - 06/8/21(月) 15:57 -

引用なし
パスワード
   ▼小僧 さん:
ありがとうございます。
無事ファイルネームフルパスを取得できました。ただ、これをどのように組み込むのか考えあぐねています。

恐縮ですが、この部分、という場所を教えてもらえませんか。
・ツリー全体表示

【8494】Re:文字列の丸めるにはどうすればいいでし...
発言  小僧  - 06/8/21(月) 15:15 -

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

>0001     100,110,120 

YU-TANGさんのWebサイトにある「DJoin関数」が参考になるかもしれません。

YU-TANG's MS-Access Discovery
DJoin 関数 - リスト文字列を取得する方法
http://x7net.com/~access/AcTipsVbaDJoin.html
・ツリー全体表示

【8493】Re:価格更新について
回答  小僧  - 06/8/21(月) 15:06 -

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

>使用OSはxpSP2、ACCESSは2003です。

という事でしたらOfficeに付属のFileDialogオブジェクトが使えそうですね。

Microsoft Office 11.0 に参照設定のチェックを入れて下さい。

Sub ダイアログテスト()
Dim dlgOpen As FileDialog

  Set dlgOpen = Application.FileDialog(msoFileDialogOpen)

  With dlgOpen
    .AllowMultiSelect = False
    .Show
  End With
  
  Msgbox dlgOpen.SelectedItems(1)

End Sub

選択したファイルのフルパスが取得できると思われます。

先ほどのコードではファイル名が固定でしたが、
こちらと組み合わせるとユーザが選択したCSVファイルを
ワークテーブルに取り込ませる事が可能です。
・ツリー全体表示

【8492】Re:価格更新について
発言  TB1  - 06/8/21(月) 14:20 -

引用なし
パスワード
   ▼小僧 さん:
さっそくのご教授大変ありがとうございます。
細かいご示唆、助かります。早速やってみます。

ファイルダイアログ
については、申し訳ありません、良く分かっていません。
使用OSはxpSP2、ACCESSは2003です。
また質問します。
宜しくお願いします。
・ツリー全体表示

【8491】文字列の丸めるにはどうすればいいでしょ...
質問  石井  - 06/8/21(月) 13:58 -

引用なし
パスワード
    文字列に対して、以下のような処理を行ないたいですが、処理方法はわかりませんので、よろしくお願いします。

元データ
振込コード  得意先コード  得意先名
0001     100       東京支店
0001     110       大阪支店
0001     120       福岡支店

結果
以下の結果を求めるには、振込コードに対して、group byで行なう方法だと思いますが、文字列の「加算」は???。
 
振込コード  得意先 
0001     100,110,120 
・ツリー全体表示

【8490】Re:価格更新について
回答  小僧  - 06/8/21(月) 13:09 -

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

> これはファイルを選択するとき、フォームの欄にどのファイルを選んだか
> アドレス(例:c:\uriage\支店\0827.csv)が分かるように表示させる仕組みです。

>この場合、更新したいcsvファイルの選択はフォーム上で出来るのでしょうか。

前回の質問を拝見させて頂いたのですが、
ファイルダイアログは使用されているのでしょうか。

まだ使われていないのでしたら
AccessやOSのバージョンによって使えるものが違いますので
明記して下さいね。

>>・ワークテーブルの削除クエリ
>>・ワークテーブルへの追加クエリ(もしくはTransferTextメソッド)

この部分をまず作っていきましょう。

CSVの内容が

4901085096321,150
4901085096332,120
4901085096343,100

の様に見出し行なし、1行目がJANコード、2行目が価格とします。
(JANコードは適当です)

ワークテーブル、W_新規価格表を用意します。
JANコード:テキスト型(主キー)
価格   :通貨型

下記コードを標準モジュールに記述します。


Sub 追加クエリの実行()
Const CSVPath = "c:\uriage\支店\0827.csv"

Dim i As Long
Dim strSQL As String
Dim Path_Name As String
Dim File_Name As String


'CSVPath の後ろから「\」の位置を求める
  i = InStrRev(CSVPath, "\")
  
'CSVPath をパス名とファイル名に分割。ファイル名の「.」は「#」に変更
  Path_Name = Left(CSVPath, i - 1)
  File_Name = Replace(Mid(CSVPath, i + 1), ".", "#")
  
'ワークテーブルの削除クエリを作成/実行
  strSQL = "DELETE FROM W_新規価格表"
  CurrentDb.Execute strSQL, dbFailOnError
  
'追加クエリを作成/実行
  strSQL = "INSERT INTO W_新規価格表( JANコード, 価格) " _
      & "SELECT [" & File_Name & "].F1, [" & File_Name & "].F2 " _
      & "FROM [" & File_Name & "] IN '" & Path_Name & "'[Text;HDR=NO;]"

  CurrentDb.Execute strSQL, dbFailOnError
  
End Sub


今回は Const句でインポートするファイルを固定していますが、
FileDialogの部分ができているのでしたら
ファイル名も可変にする事も可能です。

CSVに対しての SQLの作り方については
YU-TANGさんのWebサイトで詳しく触れられているので
参考になさってみて下さい。

YU-TANG's MS-Access Discovery
外部テキストファイルとの接続方法
http://x7net.com/~access/AcTipsGnrlHowToAttachExternalText.html
・ツリー全体表示

【8489】Re:価格更新について
質問  TB1  - 06/8/21(月) 11:08 -

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

>今回は商品マスタの更新という事ですので
>元からあるテーブルにもCSVファイルにも
>商品コードの様なものが存在しているとは思われますが、
>これがないと差換える事はできません。
はい、JANコードがそれぞれにありまして、これはuniqueなものです。

>正直な話、ご提示されたコードは
>「myImport 」「Get_FilleName」という不明な関数や
>「pstrERR」というどこにも定義されていない変数が出てきたりする為
>回答する側としても訳のわからないコードになってしまっています。
恐縮です。これはファイルを選択するとき、フォームの欄にどのファイルを選んだかアドレス(例:c:\uriage\支店\0827.csv)が分かるように表示させる仕組みです。
>
>また、DAO/ADOが混在しているコードであったりと
>TB1 さんがコードの中身を理解されて書いているのか疑問を持ってしまいます。
>(切り貼りしている感が否めません。)
正直手探りでやっております。切り貼りしているのは事実です。理解も十分ではありません。
それを承知で教えていただけるなら是非お願いします。

目指しているのは、商品の細かい情報の入ったマスターテーブルの中の、
指定した商品価格を特売価に変更すること、そしてその特売価を通常の売価にもどすことです。
これを誰もができるように、フォームを開いて「価格更新ボタン」を押すと、csvやxlsファイルの選択が出来、enterとすると必要な商品の価格が変更されている、というものです。
双方のファイルにはJANコード、売価がリレーションされていてJANはuniqueです。

>・ワークテーブルの削除クエリ
>・ワークテーブルへの追加クエリ(もしくはTransferTextメソッド)
>・元テーブルへの更新クエリ
>
>の順序で行うのが一番シンプルの様に思えますね。
>(もちろんDAO/ADOを駆使しても可能です)

この場合、更新したいcsvファイルの選択はフォーム上で出来るのでしょうか。

良い知恵があれば教えてください。
宜しくお願いします。
・ツリー全体表示

【8488】Re:価格更新について
発言  小僧  - 06/8/20(日) 11:20 -

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

> 本題はもともとある01というテーブルの売価項の値を、
> 8掛けの代わりにほかのxls、csvファイルの売価に差換えたい、ということです。

まずデータの持ち方になるのですが、
Uniqueな(重複しない)項目は存在していますか?

今回は商品マスタの更新という事ですので
元からあるテーブルにもCSVファイルにも
商品コードの様なものが存在しているとは思われますが、
これがないと差換える事はできません。


DAOなりADOで行うとしたら
CSVをインポートしたテーブルのUniqueな項目をループさせながら
元テーブルのUniqueな項目を検索させ、
一致した場合に更新を行う様な処理になります。


>Private Sub 支店01_実行_Click() 
> …
> …

正直な話、ご提示されたコードは
「myImport 」「Get_FilleName」という不明な関数や
「pstrERR」というどこにも定義されていない変数が出てきたりする為
回答する側としても訳のわからないコードになってしまっています。

また、DAO/ADOが混在しているコードであったりと
TB1 さんがコードの中身を理解されて書いているのか疑問を持ってしまいます。
(切り貼りしている感が否めません。)


雅さんのご提示された内容にもありましたが、

・ワークテーブルの削除クエリ
・ワークテーブルへの追加クエリ(もしくはTransferTextメソッド)
・元テーブルへの更新クエリ

の順序で行うのが一番シンプルの様に思えますね。
(もちろんDAO/ADOを駆使しても可能です)
・ツリー全体表示

【8487】Re:単票形式のフォームをアクティブにする...
回答  小僧  - 06/8/20(日) 10:56 -

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

>どうしても単票フォームがアクティブになりません。

通常、フォームを開いた際には
開いたフォームがアクティブ状態になりますよね。

開く元のフォームのプロパティにある「ポップアップ」はどうなっているでしょうか。
「はい」になっている場合、
後から開くフォームはフォーカスを取れない事があります。

もしそうであった場合の解決策としては

・元のフォームの「ポップアップ」のプロパティを「いいえ」にする
・開くフォームの「ポップアップ」のプロパティを「はい」にする

のどちらかの方法でいけそうですね。

他にも要因があるかもしれませんが、
まずはこちらから確認されてみてはいかがでしょうか。
・ツリー全体表示

【8486】単票形式のフォームをアクティブにする方法
質問  MINA  - 06/8/19(土) 15:25 -

引用なし
パスワード
   こんにちは。
どなたかご指導よろしくお願いします。

サブフォームを含む単票形式のフォームがあります。
その単票フォームに表示する内容が多いため一画面では表示しきれずに垂直方向にスクロールがつくようにしています。
フォームを開いたときにその単票フォームがアクティブになり、マウスやキーボードでスクロールできるようにしたいのです。
サブフォームなどのタブストップを「いいえ」にしたりしましたが、どうしても単票フォームがアクティブになりません。

方法をご存知でしたら是非教えてください。
よろしくお願いいたします。
・ツリー全体表示

【8485】Re:レポート作成
回答  YU-TANG WEB  - 06/8/19(土) 14:59 -

引用なし
パスワード
   こんにちは、YU-TANG です。

> 他にも方法がありましたら教えてください。

こちらは VBA質問箱なので、場違いとは思いますが、
VBA を一切使わない方法もありますので、ご参考まで。

http://x7net.com/~access/AcTipsRptHowToPrintRabelSpecificNumber.html

上記ページの下の方にある
「宛名ラベルを個別に枚数を指定して印刷する方法」
というのが使えるような気がします。
これ別に宛名ラベル専用の方法ではないので。

それでは。
・ツリー全体表示

【8484】Re:レポート作成
お礼  EMI  - 06/8/18(金) 19:31 -

引用なし
パスワード
   飛ばない豚さん 小僧 さん
本当にありがとうございます。
お二人のご意見を頂いて、
自分が難しい事ばっかり考え過ぎていたと痛感しました。
飛ばない豚さんのテーブルの作成方法をみて
正直、目から鱗が落ちるとともに赤面です。
小僧さんも親切にコード迄書いて頂いて本当に感謝です。
周りにアクセスを知っている人が誰も居ず、こんな簡単なも
実は1ヶ月も悩んでいました
色々な考えを教えて頂いて本当に嬉しかったです。
馬鹿にされる覚悟でここに投稿して本当に良かったです。
人の意見はとても大事な事を痛感しました。
他にも方法がありましたら教えてください。
本当に本当にありがとうございました。
・ツリー全体表示

【8483】Re:価格更新について
質問  TB1  - 06/8/18(金) 17:15 -

引用なし
パスワード
   その後、テストとしてこんなものを考えました。
-------------------------
Private Sub 支店01_実行_Click() 
  
  myImport "POScsvファイル選択", "01", False
 

  If pstrERR = "cancel" Then
    MsgBox "処理はキャンセルされました。"
    pstrERR = ""
    Exit Sub
  ElseIf pstrERR = "error" Then
    MsgBox "処理中にエラーが発生しました。再度実行して下さい。"
    pstrERR = ""
    Exit Sub
  End If
 
  Set rs = CurrentDb.OpenRecordset("01")
 
  Do Until rs.EOF
  If IsNull(rs!店番) Then
   rs.Edit
   rs!店番 = Get_FilleName(Me.Filelist.Column(0, 0))
   rs.Update
  End If
  rs.MoveNext
  Loop
  Set rs = Nothing
 
 
  Dim cn As ADODB.Connection
  Dim rs1 As ADODB.Recordset
 
  Set cn = CurrentProject.Connection
 
  Set rs1 = New ADODB.Recordset
  rs1.Open "01", cn, adOpenKeyset, adLockOptimistic
 
  Do Until rs1.EOF
 
  rs1!売価 = rs1!売価 * 0.8
  rs1.Update
  rs1.MoveNext
 
  Loop

  MsgBox "インポートしました。"
 
  rs1.Close
  Set rs = Nothing
  cn.Close
  Set cn = Nothing
 
End Sub

---------------------------
これは取込元の支店01csvファイルの中の「売価」項の値を、取込時8掛けに更新して「01」というテーブルとして取り込む、というものです。なんとかうまく行きました。
さて、本題はもともとある01というテーブルの売価項の値を、8掛けの代わりにほかのxls、csvファイルの売価に差換えたい、ということです。
ADOを使ってできないかと考えたのですが、ここから先どうしたらよいかわかりません。ADOじゃないのか、それもわかりません。
なにかいい方法があれば教えてください。
宜しくお願いします。
・ツリー全体表示

【8482】Re:レポート作成
回答  小僧  - 06/8/18(金) 9:40 -

引用なし
パスワード
   ▼EMI さん:
おはようございます。

在庫管理は難しいですよね。

在庫管理をどの程度まで正確にやるかによるのですが
1つ1つの出庫日、入庫日や単価の管理を正確にやるには

>品番  色  サイズ 点数
>AA  BK  S   1
>AA  BK  S   1
>AA  BK  S   1
>AA  BK  M   1
>AA  BK  M   1
>BB  WH  M   1

という形でテーブルにはデータを持ち、

>品番  色  サイズ 点数
>AA  BK  S   3
>AA  BK  M   2
>BB  WH  M   1

という様にユーザに見せる、という方が一般的だと思われます。


現在のテーブルのままでレポートを作成するには、
ワークテーブルを使うのが効果的でしょうか。

テーブル名:W_在庫
フィールド:品番、色、サイズ

を作成して、このテーブルを基にレポートを作成します。

レポートを発行するコマンドボタンに

Private Sub cmd印刷_Click()
'※要参照 Micosoft DAO x.x Object Library
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim strSQL As String
Dim i As Long

  Set DB = CurrentDb
  
  strSQL = "DELETE FROM W_在庫"
  CurrentDb.Execute strSQL, dbFailOnError
  
  Set RS = DB.OpenRecordset("在庫", dbOpenForwardOnly)
    Do Until RS.EOF
      For i = 1 To RS![点数]
        strSQL = "INSERT INTO W_在庫 (品番, 色, サイズ) " _
            & "VALUES('" & RS![品番] & "', " _
               & "'" & RS![色] & "', " _
               & "'" & RS![サイズ] & "')"
        DB.Execute strSQL, dbFailOnError
      Next
      RS.MoveNext
    Loop
  RS.Close
  DB.Close
  Set RS = Nothing
  Set DB = Nothing
  
  DoCmd.OpenReport "レポート名"
End Sub

のように記述する事でお望みの様な事はできるかと思われます。
・ツリー全体表示

【8481】Re:レポート作成
回答  飛ばない豚  - 06/8/18(金) 9:30 -

引用なし
パスワード
   ▼EMI さん:
案です。

「点数_行」テーブルを作ります。
点数













この「点数_行」テーブルと、「在庫」テーブルを「点数」でリレーションすれば、
希望のレポートのレコードソースが出来ます。

点数が何点まであるかにもよりますが、VBAで加工していくより簡単かと思います。


「点数_行」テーブルへのデータの追加は、以下のコードを使用すると簡単です。

Private Sub sub_データ作成()
  Dim myTENSU As Long
  Dim myLooP As Long
  Dim mySQL As String
  
  For myTENSU = 1 To 100   '点数の下限と上限
    For myLooP = 1 To myTENSU
      mySQL = "INSERT INTO 点数_行 SELECT " & _
          myTENSU & " AS 点数 "
      DoCmd.SetWarnings False
      DoCmd.RunSQL mySQL
      DoCmd.SetWarnings True
    Next myLooP
  Next myTENSU
  
End Sub

以上、案です。参考までに。
・ツリー全体表示

【8480】レポート作成
質問  EMI  - 06/8/17(木) 22:56 -

引用なし
パスワード
   アクセスを初めて、半年の初心者です。
VBAは、色々本を探しながら自分が使えそうだと思ったコードを入力しては試すの繰り返しです。
でも、どうしても分からないのですが

テーブル名 在庫

品番  色  サイズ 点数
AA  BK  S   3
AA  BK  M   2
BB  WH  M   1

上記のテーブルでレポートを作成する際に

品番  色  サイズ 点数
AA  BK  S   1
AA  BK  S   1
AA  BK  S   1
AA  BK  M   1
AA  BK  M   1
BB  WH  M   1
点数の欄は非表示でも構いません。

この様にレポートを作成する事は、可能なのでしょうか?
それとも、他に方法があるのでしょうか?
本当に初心者丸出しの質問かもしれませんが、御指導ください。
・ツリー全体表示

【8479】Re:レコードソースに重いSQLを設定すると...
お礼  katie  - 06/8/17(木) 16:30 -

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

アドバイスありがとうございます!

ワークテーブルを使うという方法をさっそく試させていただきました。

重いSQL文をExecuteメソッドで実行して結果をワークテーブルに書き込み⇒サブフォームのレコードソースにワークテーブルを指定

この方法でうまくいきました!ありがとうございます!!

↓こちらも試してみました。
>まずは事象の切り分けとして、Requeryメソッドとの
>同期が取れているかを確認されてみてはいかがでしょうか。
>
>60秒くらいの無駄なループを作るか、
>Requery用のコマンドボタンを別に設けるのが近道でしょうか。

Me.クライアント検索sub.Form.RecordSource = str_sql の後に無駄なループを入れてみましたが、状況は変わらず #Name! のエラーデータが表示されました。

Requery を別ボタン処理にしてみても #Name! のエラーデータが表示されたので、
RecordSource プロパティのところでタイムアウトしているのでは?と思いました。RecordSource でのタイムアウト(?)を防ぐ方法はないのでしょうか・・?

とりいそぎワークテーブルで回避する方向で進めます。
・ツリー全体表示

【8478】Re:価格更新について
発言  TB1  - 06/8/17(木) 14:34 -

引用なし
パスワード
   ▼雅 さん:
はじめまして
なるほど、一旦csvファイルをアクセスにとりこんで、そこでそのテーブルを指定して更新クエリを実行するということですか。
できるかどうかわかりませんが、イメージはできます。
やってみます。またつっかえたら質問いたします。
ありがとうございました。
・ツリー全体表示

【8477】Re:レコードソースに重いSQLを設定すると...
発言  小僧  - 06/8/17(木) 14:33 -

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

お力になれるかは解りませんが…。


当方は Access2003、SQLServer2005でシステムを作成していますが、
お客様が同一のレコードを更新する事がほぼない、といった条件ですので
ワークテーブルを用いて処理を行っています。

検索条件を入れて実行ボタンを押すと動的にSQLが生成されるまでは
katie さんと変わらないのですが直接レコードソースにするのではなく、

SQLはワークテーブルへのInsert文になっており、
サブフォームのレコードソースがワークテーブルになっています。

ExeuteメソッドにおいてSQL文を発行しているため同期がとれ
結果取得に時間が掛かった場合でも特に表示も問題ありません。


まずは事象の切り分けとして、Requeryメソッドとの
同期が取れているかを確認されてみてはいかがでしょうか。

60秒くらいの無駄なループを作るか、
Requery用のコマンドボタンを別に設けるのが近道でしょうか。
・ツリー全体表示

【8476】Re:フォームビューで表示されないのはなぜ...
お礼  ゆずぽん  - 06/8/17(木) 13:34 -

引用なし
パスワード
   ▼雅 さん:
クエリのエラーが原因だったようです。
貴重なお時間を割いていただき、ありがとうございました。
・ツリー全体表示

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