[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『[[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.