[[20170414104638]] 『[[20170404151036]] 『複数ファイルからの一括転』(aaaccc) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

[[20170404151036]] 『複数ファイルからの一括転記 』(aaaccc) 』(aaaccc)

皆様
お世話になります。
[[20170404151036]] 『複数ファイルからの一括転記 』が書き込みが増えてきたため、新しく立ち上げました。よろしくお願いします。

βさま

 「ところで、IDですけど、桁数等が統一されているということはないですか。
 また、評価ブックの名前ですけど 必ずIDから始まっているというルールはないでしょうか。」

とのことですが、

桁数は統一されないですね。IDといっても、
1,2,3,4,5,〜...5000のように振る可能性が高いです。

ファイル名は必ずIDから始まりますが、1とか104ではなく、1(〜〜部)のような形になると思います。

以上、よろしくお願いいたします。

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 弱音を吐くわけではないですが(いやいや、弱音を吐く?)指定された仕様を扱う要件をコード化していく際に
 もちろん、一生懸命がんばってプログラクを作成する ということなんですが、一方、コードを扱う業務を考えたとき
 そのコード体系に一定のルールがあるのとないのとでは、天と地ほどの開きが出てきます。

 現在のコード体系にルールがないということなら、それを、頑張ってルール化してもらう、
 ないしは、ブック名命名基準も たとえば IDから始まり、かつ その後ろに 何か付加する場合は、必ず 半角の ( から始める
 といったルールにしてもらう。

 こういった努力を行ってもらうことも重要です。

 いやいや、それは不可能だ。人によって、どんなブック名をつけるかわからない ということであれば
 たとえば ID が 1234 だった として 1234(最新).xlsx になっているのか 1234最新.xlsx になっているのか
 1234_ABC.xlsx になっているのかわからない。

 なので、従業員一覧のID列にある 1234、これを元にブック名と 部分一致比較をしなければいけない。

 でも、もし、従業員一覧に 123 というIDもあるかもしれない。そうすると、123 というID と 1234最新.xlsx が
 紐付いてしまいます。

 具合悪いでしょ?
 人間が目で見れば、これは違うよねとわかりますが、プログラムは、これでマッチ!! と喜んでしまいます。

 もちろん、ID列の値すべてをブック名と部分一致比較を行い、複数マッチすればその中で一番桁数の大きいものを
 採用するということはできます。やれといわれればできますけど、そこまでしたくないというのが本音です。

 なにかしら ルール化 できれば、扱うコードもずっとシンプルになる。
 つまり、aaacccさんが要件変更時にメンテする際にも 簡単にメンテできる。

 と思います。

 なにかしらのルール化ができるか、それはできないのかの 返事をお願いします。
 できないということなら、無理やり、ガンガン比較しまくりのコードを書かざるを得ないので。

 もう1つ。

 今までIDに関して 1234 という説明があったり t23 という説明があったりしましたが
 正確にはどちらですか?
 (まさか、ここも、あるものは 数字のみ、あるものは 数字と文字の組み合わせ ということはないですよね?)

 ID の中身について正確な構成を教えてください。
 頭に数字以外の文字列があるとか、そのあとに数字が続くとか、IDの最後は絶対に数字だとか。

 で、数字のみだった場合、従業員一覧にあるID(数字)は 『数値』ですか? それとも『文字列』ですか?

(β) 2017/04/14(金) 11:43


βさま

お世話になります。
お手数をお掛けし、申し訳ございません。
ファイル名からの抽出はできたらいいな程度に考えていたため、条件があいまいな質問になっていました。
申し訳ございません。

「今までIDに関して 1234 という説明があったり t23 という説明があったりしましたが

 正確にはどちらですか?
 (まさか、ここも、あるものは 数字のみ、あるものは 数字と文字の組み合わせ ということはないですよね?)
 ID の中身について正確な構成を教えてください。
 頭に数字があるとか、そのあとに数字が続くとか、IDの最後は絶対に数字だとか。

 で、数字のみだった場合、従業員一覧にあるID(数字)は 『数値』ですか? それとも『文字列』ですか?」

とのことですが、id列は1から5000までの数値とお考えください。
ファイル名の命名ルールはまだ決まりそうにないので、
提言されている「IDから始まり、かつ その後ろに 何か付加する場合は、必ず 半角の ( から始める

 といったルールにしてもらう。」という条件でお願いします。

いろいろご迷惑をお掛けしておりますが、よろしくお願いします。

(aaaccc) 2017/04/14(金) 13:23


 ブック名をそのようなルールで運用してもらえれば、コードは、現在の Test の骨格をそのまま使うことができます。

 まず、変数宣言で

    Dim id As String

 を追加してください。で、

        Set shF = Workbooks.Open(fpath & fName).Sheets(1)

 この下に、

    id = Left(fName, Len(fName) - 5)
    n = InStr(id, "(")
    If n > 0 Then id = Left(id, n - 1)

 これを追加。

 そのあとの

        Set f = idR.Find(What:=shF.Range("A1").Value, LookAt:=xlWhole, LookIn:=xlValues)

 これを

        Set f = idR.Find(What:=id, LookAt:=xlWhole, LookIn:=xlValues)

 こうすればOKになると思います。

(β) 2017/04/14(金) 15:14


βさま

お世話になります。
テストデータで実行したところ、確かに実行されました。
ありがとうございます。

あとですね、

 fName = Dir(fpath & "*.xlsx")
でマスターと同じパスにある.xlsxを対象にしていると思うんですけども、
同じパスにある.xls ファイルも対象にしたいです。
 fName = Dir(fpath & "*.xls")こうすれば、.xlsを対象にできると思うのですが、
両方対象の場合はどのように記述すればよいのでしょうか?
いろいろいじったのですが型が一致しないなどエラーが出てしまいました。

お手数をおかけしますが、よろしくお願いします。
(aaaccc) 2017/04/14(金) 15:54


 fName = Dir(fpath & "*.xlsx")

 これを

 fName = Dir(fpath & "*.xls*")

 に変更します。

 ただ、これだけでは、マクロブック自身も( .xlsm ブック)対象になってしまいますので、それを以下のようにして対象外にします。

    Do While fName <> ""

 この下に

        If fName <> ThisWorkbook.Name Then

 を追加。

        fName = Dir()

 この上に

        End If

 を追加。

(β) 2017/04/14(金) 17:15


βさま

お世話になります。
ありがとうございます。
上記確認しましたが、正しく処理されました。

本番データ(5000件)ではためしておりませんが、これで私がやりたかったことはすべて可能かなと思われます。
βさまには本当にお世話になりました。ありがとうございます。
当面は、コード理解に努めたいと思います。

ありがとうございました。

(aaaccc) 2017/04/17(月) 10:53


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.