أحاول أداء تمرين بسيط - (1) دمج عدة علامات تبويب (كل منها من ملف منفصل) في ملف واحد ("ملف ماكرو") ، (2) إعادة تسمية جميع علامات التبويب وفقًا لخلايا معينة في علامات التبويب هذه.
كل علامة تبويب هي عبارة عن كشف حساب مصرفي (بعملات مختلفة) ، لذلك تكون جميع علامات التبويب بنفس الهيكل. لقد عثرت على ماكرو (لست متخصصًا في VBA ، لذا فإن هذا يتعلق أكثر بـ "البحث والتكيف" بدلاً من "الكتابة بنفسي") لدمجها جميعًا ، لذلك لا توجد مشكلة في الخطوة 1.
ومع ذلك ، عندما أحاول إعادة تسمية جميع علامات التبويب في وقت واحد ، أواجه تعارضًا - هناك ثلاث علامات تبويب تتعلق بحساب الضمان وأربع علامات تبويب تتعلق بالحساب العادي ، وهناك تقاطع في العملات بين الحسابات (يحتوي كل حساب على USD و EUR ، على سبيل المثال).
لدي حاليًا الرمز التالي لإعادة تسمية علامات التبويب:
Sub RenameSheet ()
Dim rs As Worksheet
For Each rs In Sheets
If rs.Index > 2 Then
rs.Name = rs.Range("D4")
End If
Next rs
End Sub
ما أبحث عنه هو حل المشكلة: إذا كان الملف في مجلد معين (مثل ملف الماكرو) يحتوي على "حساب" ، فيجب تغيير قيمة الخلية في الخلية "D4" في علامة التبويب المدمجة في ملف ماكرو من "USD" (فليكن كشف حساب مصرفي بالدولار الأمريكي) إلى "Escrow USD". يجب أن يكون الماكرو قادرًا على فحص جميع الملفات في المجلد (هذا هو Loop ، بقدر ما أفهم) وإعادة تسمية الخلايا المحترمة في وقت واحد.
في ما يلي مثال للتعليمة البرمجية التي حاولت تدوينها (بدون سبب):
Sub RenameSheet ()
Dim fName As String, wb As Workbook, rs As Worksheet
For Each rs In Sheets
If rs.Index > 2 Then
Const myPath As String = "C:\Users\my folder"
If Right(myPath, 1) <> "\" Then fPath = myPath & "\"
fName = Dir(fPath & "*Full*.xlsx*")
v = "ESCROW"
Do Until fName <> ""
If InStr(1, fName, v) > 0 Then
rs.Name = "ESCROW" + rs.Range("D4")
Else
rs.Name = rs.Range("D4")
End If
Loop
End If
Next rs
End Sub
إذا كان أي منكم يمكن أن يساعدني بطريقة ما ، سأكون ممتنًا. نرحب بأي أسئلة (أفهم أن لغتي يمكن أن تكون صعبة بعض الشيء).
تحديث. الكود الحالي لدمج علامات التبويب أدناه (مرة أخرى ، هذا ليس ملكي ، فقط غوغل وإدراجه في ملفي ، يعمل بشكل مثالي):
Sub MergeExcelFiles()
Dim fnameList, fnameCurFile As Variant
Dim countFiles, countSheets As Integer
Dim wksCurSheet As Worksheet
Dim wbkCurBook, wbkSrcBook As Workbook
fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)
If (vbBoolean <> VarType(fnameList)) Then
If (UBound(fnameList) > 0) Then
countFiles = 0
countSheets = 0
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set wbkCurBook = ActiveWorkbook
For Each fnameCurFile In fnameList
countFiles = countFiles + 1
Set wbkSrcBook = Workbooks.Open(FileName:=fnameCurFile)
For Each wksCurSheet In wbkSrcBook.Sheets
countSheets = countSheets + 1
wksCurSheet.Copyafter:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
Next
wbkSrcBook.Close SaveChanges:=False
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Procesed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
End If
Else
MsgBox "No files selected", Title:="Merge Excel files"
End If
End Sub