Access VBA質問箱 IV

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

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


1161 / 2272 ツリー ←次へ | 前へ→

【8470】価格更新について TB1 06/8/17(木) 11:15 質問[未読]
【8472】Re:価格更新について 06/8/17(木) 13:06 回答[未読]
【8478】Re:価格更新について TB1 06/8/17(木) 14:34 発言[未読]
【8483】Re:価格更新について TB1 06/8/18(金) 17:15 質問[未読]
【8488】Re:価格更新について 小僧 06/8/20(日) 11:20 発言[未読]
【8489】Re:価格更新について TB1 06/8/21(月) 11:08 質問[未読]
【8490】Re:価格更新について 小僧 06/8/21(月) 13:09 回答[未読]
【8492】Re:価格更新について TB1 06/8/21(月) 14:20 発言[未読]
【8493】Re:価格更新について 小僧 06/8/21(月) 15:06 回答[未読]
【8495】Re:価格更新について TB1 06/8/21(月) 15:57 質問[未読]
【8496】Re:価格更新について 小僧 06/8/21(月) 18:21 回答[未読]
【8499】Re:価格更新について TB1 06/8/22(火) 11:25 質問[未読]
【8512】Re:価格更新について 06/8/24(木) 17:29 発言[未読]
【8517】Re:価格更新について TB1 06/8/25(金) 11:01 お礼[未読]

【8470】価格更新について
質問  TB1  - 06/8/17(木) 11:15 -

引用なし
パスワード
   宜しくお願いします。
ここに、ある価格の載った商品マスターがあります。
いくつかの商品が特売で価格変更をします。
価格更新は、更新クエリで新規価格表と商品マスターがあればできますが、
この新規価格表.csvが毎月入れ替わるので、フォーム上でそのcsvを選択し、価格を変更したいと考えています。
仮にマスターファイルを新規価格を含めて全て上書きするなら問題ないのですが、
更新品目が少ない場合、膨大なマスターからピックアップするのは大変な作業になってしまうので、更新クエリのように必要な品目と価格だけが入れ替わるしくみを作りたいと考えています。

以前、任意のcsvをフォーム上で選択してアクセスに取り込む、というものは作りましたが、今回はすでにあるテーブルを、フォーム上で選択した任意のcsvで更新する、というのが目的です。なぜアクセスのテーブルに保存するかというと、そのテーブルを支店で利用するからなのです。ですから、アクセス上で作業が完結できるようにしたいと考えています。

よい方法がありましたら、どうぞ教えてください。

【8472】Re:価格更新について
回答    - 06/8/17(木) 13:06 -

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

>以前、任意のcsvをフォーム上で選択してアクセスに取り込む、というものは作りましたが、今回はすでにあるテーブルを、フォーム上で選択した任意のcsvで更新する、というのが目的です。なぜアクセスのテーブルに保存するかというと、そのテーブルを支店で利用するからなのです。ですから、アクセス上で作業が完結できるようにしたいと考えています。

ワークテーブルに一度取り込んで更新クエリを実行してはだめですか?

でわ。

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

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

【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じゃないのか、それもわかりません。
なにかいい方法があれば教えてください。
宜しくお願いします。

【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を駆使しても可能です)

【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ファイルの選択はフォーム上で出来るのでしょうか。

良い知恵があれば教えてください。
宜しくお願いします。

【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

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

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

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

【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ファイルを
ワークテーブルに取り込ませる事が可能です。

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

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

恐縮ですが、この部分、という場所を教えてもらえませんか。

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

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

>無事ファイルネームフルパスを取得できました。
>ただ、これをどのように組み込むのか考えあぐねています。

うーん、考えあぐむ様な箇所でもないんですけどね…。


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

の箇所を

Sub 追加クエリの実行(CSVPath As String)

の様にして、
  Call 追加クエリの実行(dlgOpen.SelectedItems(1))

と呼び出すのが一番手っ取り早いでしょうか。

【8499】Re:価格更新について
質問  TB1  - 06/8/22(火) 11:25 -

引用なし
パスワード
   ▼小僧 さん:
ご指導感謝しております。
申し訳ありません。本当に理解しておりません。


>>> Sub 追加クエリの実行()
>>> Const CSVPath = "c:\uriage\支店\0827.csv"
>
>の箇所を
>
>Sub 追加クエリの実行(CSVPath As String)
>
>の様にして、
>  Call 追加クエリの実行(dlgOpen.SelectedItems(1))
>
>と呼び出すのが一番手っ取り早いでしょうか。

この説明さえも把握できません。
モジュールとコードを混同しているのでしょうか。

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

  Set dlgOpen = Application.FileDialog(msoFileDialogOpen)

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

End Sub


をどこにいれたらうまく行くのでしょうか。
教えていただけますか。

【8512】Re:価格更新について
発言    - 06/8/24(木) 17:29 -

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

>>>> Sub 追加クエリの実行()
>>>> Const CSVPath = "c:\uriage\支店\0827.csv"
>>
>>の箇所を
>>
>>Sub 追加クエリの実行(CSVPath As String)
>>
>>の様にして、
>>  Call 追加クエリの実行(dlgOpen.SelectedItems(1))
>>
>>と呼び出すのが一番手っ取り早いでしょうか。
>
>この説明さえも把握できません。
>モジュールとコードを混同しているのでしょうか。

どの辺がわかりませんか?
小僧さんはTB1さんが作った
Sub 追加クエリの実行
という関数を、引数が受けられる形にしてパラメータを渡すように
改造しましょうと書いています。

>Sub ダイアログテスト()
>Dim dlgOpen As FileDialog
>
>  Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
>
>  With dlgOpen
>    .AllowMultiSelect = False
>    .Show
>  End With
>  
>  Msgbox dlgOpen.SelectedItems(1)
>
>End Sub

これの動作確認はできたんですよね?

であれば
dlgOpen.SelectedItems(1)
が、表示できる段階で「追加クエリの実行」呼び出せばいいということに
なります。
ということは、逆にたどると「追加クエリの実行」を呼び出す前に

>Dim dlgOpen As FileDialog
>
>  Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
>
>  With dlgOpen
>    .AllowMultiSelect = False
>    .Show
>  End With

が書いてあればいいということになります。

# 小僧さんフォローありがとうございます

でわ。

【8517】Re:価格更新について
お礼  TB1  - 06/8/25(金) 11:01 -

引用なし
パスワード
   ▼雅 さん:
こんにちは
ご教授ありがとうございます。
いかに私がわかってないか、はっきりしてしまいました。
単純にsub ダイアログテスト()〜end sub を含めて埋め込もうとした、埋め込む場所が分かっていなかったのが原因でした。お恥ずかしい。
出直してきます。

1161 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078222
(SS)C-BOARD v3.8 is Free