سؤال زر إضافة / طرح Excel VBA


هنا مثال لمشروعي في هذه الصورة

enter image description here

أنا أحب جمع ، لذلك أقوم بعمل جرد في Excel.

أريد أن أقوم بطريقة يمكنني من خلالها النقر فوق زر ويؤثر على الخلية التالية أو السابقة

فمثلا:

خلية C3 سيكون لها إضافة زر ، سيكون الخلية D3 عدد النسخ لدي من هذا البند ، وخلية E3 سيكون لها طرح زر. بالنقر فوق الزر الموجود في C3 ، سيضيف واحدًا إضافيًا إلى الرقم الموجود في الخلية D3. إذا قمت بالنقر فوق الزر الموجود في C1 ، فسيتم طرحها من الخلية D3. يبدو بشكل مستقيم للأمام

هيريس الشروط على الرغم من:

لدي 200 عنصر في كل ورقة على 20 ورقة (ليس في المثال). أود بعض الطريقة التي يمكنني إضافة وحدات الماكرو إلى كافة الأزرار دون الحاجة إلى إنشاء ماكرو جديد محدد لكل زر. أنا أيضا لا أريد أن يعمل مع الخلية المختارة. يحتاج إلى التأثير على الخلية إلى اليمين لزر إضافة والخلية إلى اليسار للحصول على زر طرح.

نظرت في كل مكان لإجابة ، وجئت إلى حد قريب من الحل.

هو أقرب ما يمكن أن أجده ولكن ليس ما أنا لست ما أطلبه:

 Sub AddOne()
 ActiveCell.Value = ActiveCell.Value + 1
 End Sub

 Sub SubtractOne()
 ActiveCell.Value = ActiveCell.Value - 1
 End Sub

آمل أن يكون ذلك منطقيا وأشكركم جميعا على وقتكم.


4
2018-05-23 13:08


الأصل


اذا ماذا تريد؟ شيء يميز كل خلية أو شيء ما يعمل مع الخلية النشطة؟ - Raystafarian
I have like 200 items per sheet on like 20 sheets - كم عدد العناصر لديك على عدد الأوراق؟ بشكل عام ، السؤال الأول الرائع ، 1+ - Dave
أساسا Raystafarian أعطيت هذين الخيارين. كلاهما ليس ما أبحث عنه. أرغب في الحصول على رمز VBA عام لجعل الأزرار التي سيتم جمعها وطرحها من الخلية المتوسطة. أعلم أن هناك رمز VBA سيضيف / يطرح من خلية معينة. سأضيف صورة ربما من شأنها أن تساعد. عذرًا ، أنا جديد على هذا الموقع ، وشبه جديد إلى Excel. - Corkrum


الأجوبة:


السبب في أن الحل الخاص بك لا يعمل هو أن ورقة العمل ActiveCell لا تتغير القيمة عندما ينقر المستخدم على زر - فهم ينقرون على الزر وليس على الخلية.

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

الطريقة 1: أزرار

تستخدم هذه الطريقة اسم الزر لتنفيذ الإجراء المناسب ، على الخلية المناسبة. كنظرة عامة ، قم بإنشاء كل الأزرار الخاصة بك ، واتصل كل منها بنفس النوع الفرعي VBA العام ، والذي سيؤدي بدوره إلى معرفة الزر الذي يطلق عليه ، وقم بإجراء العملية المناسبة.

لنفترض أنك ستتصل بأزرارك مثل ADD_D3 و SUB_D3، على سبيل المثال لزيادة / تقليل القيمة في D3.


أولاً ، قم بإنشاء روتين فرعي للقيام بالعمل في VBA:

Sub AdjustValue()
    Dim btnName As String
    Dim targetCell As String
    Dim addAmount As Integer

    btnName = Application.Caller
    targetCell = Mid(btnName, 5, Len(btnName))
    addAmount = IIf(Left(btnName, 3) = "ADD", 1, -1)

    ActiveSheet.Range(targetCell).Value = _
        ActiveSheet.Range(targetCell).Value + addAmount
End Sub

تقسمها:

  1. Application.Caller يعطيك اسم المتصل ، في هذه الحالة اسم الزر
  2. نأخذ اسم الخلية المستهدفة من النهاية ، بتخطي الأحرف الأربعة الأولى
  3. نكتشف ما إذا كنا نضيف أو نستقطع استنادًا إلى الأحرف الثلاثة الأولى
  4. نستخدم اسم الخلية الهدف لتحديث خلية ورقة العمل

بعد ذلك ، قم بإنشاء الأزرار الخاصة بك ؛ إضافة أزرار التحكم في النموذج إلى جدول البيانات الخاص بك لكل من + و - الأزرار التي تحتاجها.

لكل منها ، قم بتعيين اسم منهجي بناءً على الخلية التي يجب أن تستهدفها ، كما هو موضح أعلاه. على سبيل المثال في لقطة الشاشة أعلاه ، يمكنك تسمية أول زرين ADD_D3 و SUB_D3.
لإعادة تسمية زر ، انقر بزر الماوس الأيمن عليه لتحديده ، ثم في مربع العنوان الموجود في أعلى يسار ورقة العمل ، اكتب الاسم (على سبيل المثال ، الزر 1) باسمك الجديد:
enter image description here

وأخيرًا ، يجب أن يعمل ما سبق في أوراق متعددة أيضًا ، نظرًا لاستخدامات فرعية ActiveSheet للوصول إلى الخلية.


الطريقة الثانية: تغيير التحديد

هذا هو أبسط من ذلك بكثير لإعداد ، لكنه سخيف بعض الشيء. أولاً ، قم بإعداد الورقة مع رموز زائد وناقص في كل خلية ، مع تلوينها على الرغم من أنك تريد جعلها تبدو أكثر تشبهًا للأزرار. فمثلا: enter image description here

لاحظ أنه يجب عليك استخدام علامة اقتباس مفردة (') لوضع الرمز في الخلية كنص ، على سبيل المثال. '- و '+ (هذا مرئي في شريط الصيغة في أعلى المثال).

بعد ذلك ، أنشئ روتينًا واحدًا للاستجابة إلى إحدى الخلايا التي يتم تحديدها:

Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim numCell As Range

    If Target.Count <> 1 Then Exit Sub

    If Target.Value = "+" Then
        Set numCell = Target.Offset(0, -1)
        numCell.Select
        numCell.Value = numCell.Value + 1
    ElseIf Target.Value = "-" Then
        Set numCell = Target.Offset(0, 1)
        numCell.Select
        numCell.Value = numCell.Value - 1
    End If
End Sub

تقسمها:

  1. يعد اسم العنصر الفرعي مهمًا - حيث يُعلم Excel بتشغيل الفرعي الخاص بك عندما ينقر المستخدم على أي خلية
  2. ال Target المعلمة هي الخلية التي تم النقر عليها من قبل المستخدم ، ولكن يمكن أن يكون تحديد السحب أيضًا. نتحقق أولاً من أن الحجم واحد بالضبط ، وإنهاء إذا لم يكن.
  3. بعد ذلك نتحقق من قيمته إما + أو - القيمة. لاحظ أنه ليس علينا التحقق من علامة الاقتباس.
  4. ثم نستخدم Offset أمر للعثور على الخلية إلى اليسار أو اليمين ، وهذا يتوقف على ما إذا كنا نتعامل مع + أو - خلية البداية
  5. وبمجرد أن نحصل على الخلية رقم ، نختارها أولاً ، ثم نغير قيمتها لأعلى أو لأسفل

السبب في تحديدنا لخانة الأرقام هو أنه يتحرك التحديد إيقاف ال + أو - الخلية ، بحيث يمكنك النقر فوقه مرة أخرى. إذا كنت ترغب في العمل على هذه الخلايا ، فأنت بحاجة إلى تعطيل هذا الفرعي مؤقتًا ، على سبيل المثال عن طريق وضع Exit Sub خط في الأعلى.

ملاحظة صغيرة: Worksheet_SelectionChange هو ما ستستخدمه إذا كنت تعمل في ماكرو الورقة: enter image description here

إذا كنت تعمل في ThisWorkbook الوحدة النمطية ، سترغب في استخدام الفرعي تغيير التحديد العالمي:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'Code goes in here
End Sub

يجب أن يعمل نفس الرمز - وفي هذه الحالة ستعمل على كل ورقة في المصنف الخاص بك.


مثال جدول يوضح كلا المثالين هنا.


4
2018-05-23 15:25



لا مشكلة - هل حل المشكلة؟ - Geoff
ليس بعد ، ما زلت أحاول معرفة ذلك. أنا أتابع كلاهما من أعلى التعليمات إلى أسفل. كل شيء يبدو نفسه ولكن أول واحد يدير خطأ ، والآخر لست متأكدا من كيفية جعل الخلية قادرة على النقر. لذلك كان لي الحظ على كل من لول. - Corkrum
مع الثانية ، لا تحتاج إلى جعل الخلية قابلة للنقر على الإطلاق ؛ السحر هو في اسم الفرعية (Worksheet_SelectionChange) ، مما يؤدي إلى إطلاق النار الفرعي في كل مرة أي يتم النقر الخلية. يتجاهل الباطن الخلايا التي ليست مهتمة بها. - Geoff
هذا بالتأكيد هو الحل الذي يمكنني استخدامه (تغيير الاختيار "الهاكر"). هذا يعني أنه يمكنك وضع اسمك القابل للتحصيل ، زائدًا وناقصًا في أي مكان تريده وسيعمل. ولا تحتاج إلى الفوضى مع عناصر تحكم النموذج. - Jonny Wright
انظر تحرير صغير - قد ترغب في وضع التعليمات البرمجية الخاصة بك ThisWorkbook بدلا من ذلك ، في هذه الحالة التي تستخدمها Workbook_SheetSelectionChange. هذا يمنحك النقر العالمي. - Geoff