古いプログラムで10年以上使っています。
一番下のフォルダには、以前古いエクセルファイル Excel 97-2003 ワークシート (.xls) が入っていました。(簡単なマクロも入っています)
そのファイル群の合計データの一部を項目別に入荷集計表に反映するプログラムです。
マイクロソフトで古いエクセルファイルのサポートが終わっていましたので、ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています。
対応方法をご教授いただけると大変助かります。
FileSearch2007が使えなくなったことも原因かなと思うのですが、
どうしてもわからなく困っています。
新しいファイル検索のプログラムがあるようなのですが、
初心者のため、理解が難しく非常に困難な状況に置かれています。
最新のエクセルで動作するようプログラムを教えていただけるでしょうか。
現在のプログラムは下記にあります。
"C:\Users\ユーザーアカウント名\Desktop\在庫表\受払.xlsm"
このプログラムを使って、
C:\Users\ユーザーアカウント名\Desktop\在庫表\在庫表詳細\顧客にある*.xlsm"ファイルを検索して別の集計表に反映するプログラムです。
どうか、よろしくお願いいたします。
-------以下プログラム-------
Dim FAR(1999), AR(1999, 9), ゼロ表示, 件数, 最終行
Dim wkDate As Date
Sub P11_フォルダ内容書出し()
記入済データを消去_11
進度表示_11
パス名Book名を配列ARに格納_11
個別Bookの内容を配列に格納_11
配列の内容をシートに記入_11
並び替え_11
End Sub
'*---------------------------------------------------------------------------------*
Function 記入済データを消去_11()
Worksheets("入荷集計表").Activate
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Msg = "シート「入荷集計表」を最新の状態に更新します。実行しますか?"
msg_rt = MsgBox(Msg, vbYesNo)
If msg_rt <> vbYes Then End
If Range("B4") <> "" Then
Rows("4:" & 1999).Delete Shift:=xlUp
End If
If IsDate(Range("G2")) Then
wkDate = CDate(Range("G2"))
Else
wkDate = CDate("2060/12/31")
End If
Debug.Print Format(wkDate, "yyyy/mm/dd")
End Function
'*---------------------------------------------------------------------------------*
Function パス名Book名を配列ARに格納_11()
k = -1
target_path = ThisWorkbook.Path
target_extention = UCase("xlsm")
Set found_file = FileSearch2007(target_path, target_extention)
件数 = found_file.Count
If 件数 = 0 Then
MsgBox "*.xlsmファイルがないため処理を終了します。"
End
End If
For i = 1 To 件数
If Right(found_file(i), 10) <> "フォーマット.xlsm" And _
Right(found_file(i), 7) <> "在庫表.xlsm" Then
k = k + 1
FAR(k) = found_file(i)
End If
Next
End Function
'*---------------------------------------------------------------------------------*
Function 個別Bookの内容を配列に格納_11() '合計の行をFIND関数で検索する Do~Loopは時間がかかるため
Dim Idx1 As Integer
k = -1
For i = 0 To 1999
If FAR(i) = "" Then Exit For
Workbooks.Open Filename:=FAR(i), UpdateLinks:=0 '外部リンクを表示しない
For Idx1 = 7 To 1000
If Range("C" & Idx1) = "" Then
Exit For
End If
k = k + 1
AR(k, 0) = FAR(i)
AR(k, 1) = Range("E1")
AR(k, 2) = Range("M2")
AR(k, 3) = Range("C2")
AR(k, 4) = Range("H2")
AR(k, 5) = Range("C3")
AR(k, 6) = Range("B" & Idx1)
AR(k, 7) = "'" & Range("C" & Idx1)
AR(k, 8) = Format(Range("Z" & Idx1), "0.0")
AR(k, 9) = "'" & Range("AF" & Idx1)
Next Idx1
件数 = k
ActiveWorkbook.Close
Next i
End Function
'*---------------------------------------------------------------------------------*
Function 配列の内容をシートに記入_11()
Workbooks("RCM受払.xlsm").Worksheets("入荷集計表").Activate
行 = 3
For i = 0 To 件数
If AR(i, 0) <> "" Then
If AR(i, 8) <> 0 And AR(i, 6) <= wkDate Then
行 = 行 + 1
For j = 1 To 9 'B列:P列
Cells(行, j) = AR(i, j)
Next
Cells(行, 10) = AR(i, 0)
End If
End If
Next
最終行 = 行
End Function
'----------------------------------------------------------------------------------------*
No.7
- 回答日時:
こんにちは
Sub 並べ替え()については記録マクロで不要と思われる部分もありますが
問題はないと存じます
しかし、拡張子変更に伴いブック自体に問題があるかも知れません
対象ブック群を新規ブックにコピペするVBAなどで作り直す必要があるかも知れませんね(やり方は色々ありますが元ブックはあるかな?)
ご質問にあるコードですが、疑問があります
Workbooks.Openで開いたブックには1シートしかないのでしょうか?
For j = 1 To 9 'B列:P列
Cells(行, j) = AR(i, j)
Next
Cells(行, 10) = AR(i, 0)
End If
かなりのデータ数を書き込んでいるようですが AR作成時に工夫して
ARを一度に出力した方が処理の負担が減ると思います
>'合計の行をFIND関数で検索する Do~Loopは時間がかかるため
FIND見当たらないのですが・・
ご質問のコードを添削して条件に合ったデータを書き出すコードを作ってみますね(不明なところはコメント)
No.6
- 回答日時:
#5です
拡張子変更による不具合についてですが
Workbooks.Open Filename:=FAR(i), UpdateLinks:=0
ここにブレークポイントを設置して実行
到達すればファイルパスは取得できていると思います
その後 F8キーでステップイン Workbooks.Open でスタックするようであれば (値の取得だけのようなので)
該当Excelファイルのマクロを無効又は削除して実行してみてください
状況によってはコピーファイルを拡張子xlsxに変更してとか
互換モードで開くなど試してみてはいかがでしょう
(簡単なマクロも入っています)使うのかな?
該当しないかもですが
https://answers.microsoft.com/ja-jp/msoffice/for …
Qchan1962さん
ありがとうございます。
いろいろと助かります。
エクセル2000で作成したマクロが入っている.xls ファイルですが、
今のエクセル365でも動作しています。
単純に中のデータを在庫があるものを数量が大きい順に
並び替えるマクロが入っています。
どうしてもこの機能は必要なので使用しています。
昔、記録したマクロです。
何か問題はありそうでしょうか?
Option Explicit
Sub 並べ替え()
'
' 並べ替え Macro
' マクロ記録日 : 2007/8/28 ユーザー名 : S
'
'
ActiveWindow.SmallScroll Down:=-3
Range("A7:AF7").Select
ActiveWindow.SmallScroll Down:=27
Range("A7:AF45").Select
Selection.Sort Key1:=Range("AD6"), Order1:=xlDescending, Key2:=Range("Z7" _
), Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin
ActiveWindow.SmallScroll Down:=-63
ActiveWindow.SmallScroll ToRight:=-3
Range("D7").Select
End Sub
No.5
- 回答日時:
>"C:\Users\ユーザーアカウント名\Desktop\R在庫表\R関係在庫表\顧客名\メーカー名\素材合計\素材名\素材ファイル.xlsm"
このファイル決め打ちなら
Function パス名Book名を配列ARに格納_11()は要らないと思いますよ
コードに不備があったので一応書き直します
拡張子変更による不具合は検討していません
FileSearch2007の代替えコードです
Function パス名Book名を配列ARに格納_11()
Dim found_file()
Dim target_path As String, target_extention As String
Dim k As Long, f As String, i As Long
Dim Path As String, Wsh As Variant
Set Wsh = CreateObject("WScript.Shell")
Path = Wsh.SpecialFolders("Desktop") & "\"
Set Wsh = Nothing
target_path = Path & "\R在庫表\R関係在庫表\顧客名\メーカー名\素材合計\素材名"
target_extention = UCase("xlsm")
f = Dir(target_path & "\*." & target_extention)
Do While f <> ""
ReDim Preserve found_file(k)
found_file(k) = target_path & "\" & f
k = k + 1
f = Dir
Loop
If k = 0 Then
MsgBox "*.xlsmファイルがないため処理を終了します。"
End
End If
For i = 0 To UBound(found_file)
If Not InStr(found_file(i), "フォーマット.xlsm") > 0 And _
Not InStr(found_file(i), "在庫表.xlsm") > 0 Then
FAR(i) = found_file(i)
End If
Next
End Function
ありがとうございます。
何回も申し訳ありません。
やはり途中で落ちてしまいます。
>"C:\Users\ユーザーアカウント名\Desktop\R在庫表\R関係在庫表\顧客名\メーカー名\素材合計\素材名\素材ファイル.xlsm"
顧客名以下の階層フォルダですが、実際にはいろいろな名称になっています。
素材合計 というフォルダ名だけは共通の階層とフォルダ名です。
例えば
"C:\Users\ユーザーアカウント名\Desktop\R在庫表\R関係在庫表\A社\B工業\素材合計\SUS301H\0.2x500.xlsm"
上記のようになっています。
No.4
- 回答日時:
>マイクロソフトで古いエクセルファイルのサポートが終わっていましたので、ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています。
どのようにして拡張子を.xlsmに変えたのでしょうか。
単純にエクスプローラとかコマンドプロンプトで、ファイル名の拡張子を変えただけではおかしくなります。
No.3
- 回答日時:
#2です・・
間違えちゃった
For i = 0 To 件数 - 1
If Not InStr(found_file(i), "フォーマット.xlsm") > 0 And _
Not InStr(found_file(i), "在庫表.xlsm") > 0 Then
k = k + 1
FAR(k) = found_file(i)
End If
Next
は 下記に変更してください
For i = 0 To 件数 - 1
If Not InStr(found_file(i), "フォーマット.xlsm") > 0 And _
Not InStr(found_file(i), "在庫表.xlsm") > 0 Then
FAR(i) = found_file(i)
End If
Next
使用箇所
For i = 0 To 1999
If FAR(i) = "" Then Exit For
Workbooks.Open Filename:=FAR(i)
0スタートでOK
ありがとうございます。
書き換えてみたのですすが、デバッグになってしまい先に進みません。
フォルダ階層が深くなっていましたので、訂正いたします。
"C:\Users\ユーザーアカウント名\Desktop\R在庫表\R受払.xlsm"
このプログラムを使って、
"C:\Users\ユーザーアカウント名\Desktop\R在庫表\R関係在庫表\顧客名\メーカー名\素材合計\素材名\素材ファイル.xlsm"
を検索して別の集計表に反映するプログラムです。
No.2
- 回答日時:
こんにちは
FileSearch2007 って 確かファイルパスも含まれていた気が・・
Workbooks.Open Filename:=FAR(i)
ですね
単純にThisWorkbook.Path同階層でDirを使って
Function パス名Book名を配列ARに格納_11()を変えると
Function パス名Book名を配列ARに格納_11()
Dim found_file()
Dim k As Long
target_path = ThisWorkbook.Path
target_extention = UCase("xlsm")
f = Dir(target_path & "\*." & target_extention)
Do While f <> ""
ReDim Preserve found_file(k)
found_file(k) = target_path & f
k = k + 1
f = Dir
Loop
件数 = UBound(found_file) + 1
If 件数 = 0 Then
MsgBox "*.xlsmファイルがないため処理を終了します。"
End
End If
For i = 0 To 件数 - 1
If Not InStr(found_file(i), "フォーマット.xlsm") > 0 And _
Not InStr(found_file(i), "在庫表.xlsm") > 0 Then
k = k + 1
FAR(k) = found_file(i)
End If
Next
End Function
取り合えず試していませんが・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python renameについて
-
window.open でのファイル指定方法
-
WindowsでPerlをする際,1行目の...
-
行を指定して削除する方法PERL
-
Firefox で file:// で始まる U...
-
MATLABのm-fileについて
-
perl ファイルが開かない
-
VBA テキストファイルを読み取...
-
VBAでCSVファイルの特定行を書...
-
dos変数の%~dp0は powershellで...
-
batファイルでrenameができませ...
-
Perlで特定行から特定行までを...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
vba dir の相対パス
-
DOSコマンドで、標準出力を出力...
-
CSVデータの編集の際の重複チェ...
-
file_exists関数について
-
ファイルロックの解除方法
-
Perlの変数に文字数制限(容量...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
VBA テキストファイルを読み取...
-
Firefox で file:// で始まる U...
-
MATLABのm-fileについて
-
fgets で値が取得できない
-
ファイルの存在の有無を確かめ...
-
drtファイルはどうしたら開...
-
perl ファイルが開かない
-
PerlでのUseless use...
-
VBAコードを張り付け後のエクセ...
-
JSP URLに表示される拡張子 .jsp
-
csvファイルの横方向への改行に...
-
perlでCSV形式ファイルのア...
-
行を指定して削除する方法PERL
-
WindowsでPerlをする際,1行目の...
-
【C++/CLI】ファイルオープンに...
-
巨大なテキストの最終行を取得...
-
C言語で正の整数n を受け取って...
-
ファイル全てを .xlsm に変更し...
おすすめ情報
Qchan1962様
追記がありました。
先ほどのマクロは拡張子を .xlsm にしても正常に動作しています。
よろしくお願いいたします。
Function 個別Bookの内容を配列に格納_11() '合計の行をFIND関数で検索する Do~Loopは時間がかかるため
Dim Idx1 As Integer
k = -1
For i = 0 To 1999
If FAR(i) = "" Then Exit For
Workbooks.Open Filename:=FAR(i), UpdateLinks:=0 '外部リンクを表示しない
For Idx1 = 7 To 1000
If Range("C" & Idx1) = "" Then
Exit For
End If
続きを次の補足に書きます。
k = k + 1
AR(k, 0) = FAR(i)
AR(k, 1) = Range("E1")
AR(k, 2) = Range("M2")
AR(k, 3) = Range("C2")
AR(k, 4) = Range("H2")
AR(k, 5) = Range("C3")
AR(k, 6) = Range("B" & Idx1)
AR(k, 7) = "'" & Range("C" & Idx1)
AR(k, 8) = Format(Range("Z" & Idx1), 0)
AR(k, 9) = "'" & Range("AF" & Idx1)
続きを次の補足に書きます
Next Idx1
件数 = k
ActiveWorkbook.Close
Next i
End Function
ここの構文でVBAが落ちてしまいます。
各ブックをオープンしてデータをひろっています。
Nextから戻って、何回かは動いていますが、突然落ちてしまいます。
何回もすみません。