تعديل جدول بيانات باستخدام ماكرو VB
سؤال
عندي جدولين...عندما يتم تعديل أحدهما بطريقة معينة، أرغب في تشغيل ماكرو لتعديل الثاني بطريقة مناسبة.لقد قمت بالفعل بعزل الحدث الذي أحتاج إلى التصرف بناءً عليه (تعديل أي خلية في عمود معين)، ويبدو أنني لا أستطيع العثور على أي معلومات محددة حول الوصول إلى جدول بيانات آخر وتعديله (يوجد جدول البيانات هذا على شبكة LAN مختلفة شارك ايضا...ومع ذلك، يمكن للمستخدم الوصول إلى كليهما).
أي مساعدة ستكون عظيمة.تعتبر المراجع حول كيفية القيام بذلك أو شيء مشابه جيدة مثل عينات التعليمات البرمجية الملموسة.
المحلول
في Excel، من المحتمل أن تقوم فقط بكتابة التعليمات البرمجية لفتح ورقة العمل الأخرى وتعديلها ثم حفظ البيانات.
يرى هذا البرنامج التعليمي لمزيد من المعلومات.
سأضطر إلى تعديل VBA الخاص بي لاحقًا، لذا تظاهر بأن هذا كود زائف، ولكن يجب أن يبدو كما يلي:
Dim xl: Set xl = CreateObject("Excel.Application")
xl.Open "\\the\share\file.xls"
Dim ws: Set ws = xl.Worksheets(1)
ws.Cells(0,1).Value = "New Value"
ws.Save
xl.Quit constSilent
نصائح أخرى
يمكنك فتح جدول بيانات في سطر واحد:
Workbooks.Open FileName:="\\the\share\file.xls"
والإشارة إليه باعتباره المصنف النشط:
Range("A1").value = "New value"
بعد اللعب بهذا لفترة من الوقت، وجدت أن رمز مايكل الزائف هو الأقرب، ولكن إليك كيفية القيام بذلك:
Dim xl As Excel.Application
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open "\\owghome1\bennejm$\testing.xls"
xl.Sheets("Sheet1").Select
ثم تلاعب بالورقة...ربما مثل هذا:
xl.Cells(x, y).Value = "Some text"
عند الانتهاء، استخدم هذه السطور للانتهاء:
xl.Workbooks.Close
xl.Quit
إذا تم إجراء تغييرات، سيُطلب من المستخدم حفظ الملف قبل إغلاقه.قد تكون هناك طريقة للحفظ تلقائيًا، ولكن هذه الطريقة أفضل في الواقع، لذا سأتركها كما هي.
شكرا لجميع التعليمات!
انسخ ما يلي في ملفك ThisWorkbook
كائن لمشاهدة تغييرات محددة.في هذه الحالة عند زيادة قيمة رقمية إلى قيمة رقمية أخرى.
ملحوظة:سيكون عليك استبدال Workbook-SheetChange
و Workbook-SheetSelectionChange
مع الشرطة السفلية.السابق: Workbook_SheetChange
و Workbook_SheetSelectionChange
يتم الهروب من الشرطة السفلية في كود Markdown.
Option Explicit
Dim varPreviousValue As Variant ' required for IsThisMyChange() . This should be made more unique since it's in the global space.
Private Sub Workbook-SheetChange(ByVal Sh As Object, ByVal Target As Range)
' required for IsThisMyChange()
IsThisMyChange Sh, Target
End Sub
Private Sub Workbook-SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' This implements and awful way of accessing the previous value via a global.
' not pretty but required for IsThisMyChange()
varPreviousValue = Target.Cells(1, 1).Value ' NB: This is used so that if a Merged set of cells if referenced only the first cell is used
End Sub
Private Sub IsThisMyChange(Sh As Object, Target As Range)
Dim isMyChange As Boolean
Dim dblValue As Double
Dim dblPreviousValue As Double
isMyChange = False
' Simple catch all. If either number cant be expressed as doubles, then exit.
On Error GoTo ErrorHandler
dblValue = CDbl(Target.Value)
dblPreviousValue = CDbl(varPreviousValue)
On Error GoTo 0 ' This turns off "On Error" statements in VBA.
If dblValue > dblPreviousValue Then
isMyChange = True
End If
If isMyChange Then
MsgBox ("You've increased the value of " & Target.Address)
End If
' end of normal execution
Exit Sub
ErrorHandler:
' Do nothing much.
Exit Sub
End Sub
إذا كنت ترغب في تغيير مصنف آخر بناءً على ذلك، أفكر في التحقق لمعرفة ما إذا كان المصنف مفتوحًا بالفعل أولاً...أو من الأفضل تصميم حل يمكنه تجميع جميع التغييرات وتنفيذها مرة واحدة.قد يكون تغيير جدول بيانات آخر باستمرار بناءً على استماعك لهذا الجدول مؤلمًا.