سؤال

أحاول إنشاء ماكرو يقارن اثنين من أوراق عمل المستخدم في وضع ثم ينقل الاختلافات إلى أوراق مختلفة اعتمادا على سبب اختلافها.

يطلب الرمز أولا إدخال أحدث البيانات ويفتح تلك الورقة.ثم يسأل عن موقع البيانات القديمة للمقارنة مع ولكن لا يفتحه.يضيف الأوراق اللازمة للنسخ إليها.

ثم يذهب إلى أسفل خلية عمود من خلية تبحث عن المسلسل مطابقة على كتاب العمل الثاني (وهذا هو أساسا للتأكد من أن مقارنة البيانات الصحيحة في حالة التنسيق هو خارج).بمجرد العثور على المسلسل المطابق ، فإنه يقارن المسلسل الثاني لكل من الإدخال واعتمادا على ما إذا كان مدخلاته المختلفة أو الجديدة في إحدى الأوراق.

القضية الرئيسية أواجه هو مع فلوكوب.هو وجود أخطاء متعددة 424 ، 1004 وتجميع أخطاء التعبير.أحتاج إلى القليل من التوجيه حول سبب وجود هذه المشكلات.لقد بحثت ووجدت الكثير عن الحاجة إلى وجود أقواس للإشارة إلى ملف ولكن عندما أتبع هذه التنسيقات بالضبط فإنه يلقي خطأ التعبير.

أي نصيحة هي موضع تقدير.

Sub Compare()

'Open workbooks
''Worksheet 1

Dim filter As String
Dim caption As String
Dim WB1FN As String
Dim WB1 As Workbook

filter = "Excel Sheets (*.xlsx),*.xlsx"
caption = "Please select newest equipment file"
MsgBox (caption)
WB1FN = Application.GetOpenFilename(filter, , caption)

        If WB1FN = "False" Then
            MsgBox "File not selected to import"
            Exit Sub
        End If

Set WB1 = Application.Workbooks.Open(WB1FN)

''Worksheet 2

Dim caption2 As String
Dim WB2FN As String

filter = "Excel Sheets (*.xlsx),*.xlsx"
caption2 = "Please select previous equipment file"
MsgBox (caption2)
WB2FN = Application.GetOpenFilename(filter, , caption)

        If WB2FN = "False" Then
            MsgBox "File not selected to import"
            Exit Sub
        End If

'Comparing data
''MS find and compare

Dim MS1 As String
Dim ESN1 As String
Dim ESN2 As String
Dim LastRow As Long
Dim i As Integer
Dim d As Integer
Dim n As Integer
Dim Filename As String

d = 4
n = 4

Set WB1 = ActiveWorkbook

'Create sheets

Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "A"
Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "B"
Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "C"

'Gets the last row number

ActiveWorkbook.Sheets(1).Activate
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

For i = 4 To LastRow

''Assigning MS1,ES1,ES2

    MS1 = Cells(i, 6)
    ESN1 = Cells(i, 15)
    ESN2 = Application.WorksheetFunction.VLookup(MS1, '[" & WB2FN & "]Sheet1'! [R3C6:R10000C15], 10, False)
''Compare ESN and copy data

        If ESN2 <> ESN1 Then
        cell.EntireRow.Copy Sheets(2).Cells(d, 1)
        n = d + 1
        ElseIf Application.WorksheetFunction.IsNA(ESN2) = "TRUE" Then
        cell.EntireRow.Copy Sheets(4).Cells(n, 1)
        n = n + 1
        End If
Next i

'X find and copy

Dim OEM As String

ActiveWorkbook.Sheets(2).Activate

LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

n = 3
i = 3

For i = 3 To LastRow

''Check for X

    OEM = Cells(i, 4)

    If OEM = "x" Then
        cell.EntireRow.Copy Sheets(3).Cells(n, 1)
        n = n + 1
    End If

Next i

MsgBox "Compare successful"

End Sub
هل كانت مفيدة؟

المحلول

have brackets to reference a file يمكنك فقط استخدام هذا النهج إذا كنت تقوم بتعيين صيغة لخلية أو نطاق.

مثال:

Dim myformula As String

myformula = "=VLOOKUP(" & MS1 & _
    ",'[" & WB2FN & "]Sheet1'! [R3C6:R10000C15], 10, False)"
Range("A1").Formula = myformula

ولكن إذا كنت تستخدم فبا ورقة عمل وظيفة, ، تحتاج إلى الوصول بطريقة أو بأخرى إلى قاعدة البيانات أو الجدول الذي تجلب البيانات منه في وقت التشغيل.وهذا يعني أن لديك لتمرير الكائنات على الحجج وليس سلاسل كما تفعل في أعلاه.
شيء من هذا القبيل:

'~~> the rest of your code before Vlookup here

Dim wb As Workbook
Dim mytable As Range

Set wb = Workbooks.Open(WN2FN, , True) '~~> read only, avoid errors when file in use
Set mytable = wb.Sheets("Sheet1").Range("F3:O10000")

On Error Resume Next '~~> to handle when Vlookup returns #N/A or errors out
ESN2 = Application.WorksheetFunction.VLookup(MS1, mytable, 5, 0)
If Err.Number <> 0 Then myvalue = CVErr(xlErrNA)
On Error GoTo 0 '~~> reset error handling to trap other errors

Debug.Print ESN2

أنا فقط قدمت الجزء حيث يمكنك استخدام فلوكوب ووركشيتفونكتيون.يمكنك استخدام بقية التعليمات البرمجية قبل ذلك.أساسا فوق التعليمات البرمجية:

  • يعين الجدول المصدر إلى متغير وتمريرها مباشرة إلى فلوكوب الحجج.
  • الاستخدامات فلوكوب عبر فبا ووركشيتفونكتيون لجلب البيانات.

لاحظ أويرن (على خطأ استئناف التالي) روتين و أوغ 0 (على خطأ انتقل الى 0).
في فبا عندما وظيفة ورقة العمل إرجاع خطأ (على سبيل المثال.#ن/أ ل فلوكوب) ، أخطاء التعليمات البرمجية خارج وتوقف التنفيذ.لا يوجد إيفيرور كما لدينا في صيغ ورقة العمل.لذلك تحتاج إلى التعامل معها باستخدام إجراءات معالجة الأخطاء.

لاحظ أيضا أنه من الأفضل تأهيل الكائنات التي تعمل عليها بشكل كامل.
هذا هو مكان جيد للبدء في تحسين الرموز الخاصة بك وتجنب أخطاء وقت التشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top