اكسل:نطاقات القائمة المستهدفة بواسطة الصيغ غير المباشرة

StackOverflow https://stackoverflow.com/questions/34493

  •  09-06-2019
  •  | 
  •  

سؤال

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

أحتاج الآن إلى نقل نطاقات البيانات التي تستهدفها هذه الصيغ إلى موقع مختلف في نفس المصنف.

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

هل هناك أي طريقة لتحديد موقع جميع الصيغ غير المباشرة التي تشير حاليًا إلى الجداول التي نريد نقلها؟

لست بحاجة للقيام بذلك عبر الإنترنت.سأقوم بسعادة بأخذ شيء يستغرق تشغيله 4 ساعات طالما أنه يمكن الاعتماد عليه.

انتبه إلى أن الأساليب .Precedent و.Dependent وما إلى ذلك تتبع الصيغ المباشرة فقط.

(أيضًا، إعادة كتابة جداول البيانات في أيا كان ليس خيارا بالنسبة لنا).

شكرًا!

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

المحلول

يمكنك التكرار على المصنف بأكمله باستخدام vba (لقد قمت بتضمين الكود من @PabloG و@euro-micelli ):

Sub iterateOverWorkbook()
For Each i In ThisWorkbook.Worksheets
    Set rRng = i.UsedRange
    For Each j In rRng
        If (Not IsEmpty(j)) Then
            If (j.HasFormula) Then
                If InStr(oCell.Formula, "INDIRECT") Then
                    j.Value = Replace(j.Formula, "INDIRECT(D4)", "INDIRECT(C4)")
                End If
            End If
        End If
    Next j
Next i
End Sub

يستبدل هذا المثال كل تكرار لـ "indirect(D4)" بـ "indirect(C4)".يمكنك بسهولة تبديل وظيفة الاستبدال بشيء أكثر تعقيدًا، إذا كان لديك وظائف غير مباشرة أكثر تعقيدًا.الأداء ليس بهذا السوء، حتى بالنسبة للمصنفات الأكبر حجمًا.

نصائح أخرى

س:"هل هناك أي طريقة لتحديد موقع كافة الصيغ غير المباشرة التي تشير حاليًا إلى الجداول التي نريد نقلها؟"

عندما قرأته، تريد أن تنظر داخل حجج INDIRECT للحصول على إشارات إلى مجالات الاهتمام.OTTOMH سأكتب VBA لاستخدام محلل تعبير عادي، أو حتى INSTR بسيط للعثور على INDIRECT (اقرأ إلى الأمام للمطابقة)، ثم قم بتقييم () السلسلة الموجودة بالداخل لتحويلها إلى العنوان الفعلي، كرر كما هو مطلوب لعدة INDIRECT (...) يستدعي ويفرغ الصيغة وترجمتها إلى عمودين في ورقة.

يمكنك استخدام شيء مثل هذا في VBA:

Sub ListIndirectRef()

Dim rRng As Range
Dim oSh As Worksheet
Dim oCell As Range

For Each oSh In ThisWorkbook.Worksheets
    Set rRng = oSh.UsedRange
    For Each oCell In rRng
        If InStr(oCell.Formula, "INDIRECT") Then
            Debug.Print oCell.Address, oCell.Formula
        End If
    Next
Next

End Sub

بدلاً من Debug.Print، يمكنك إضافة تعليمات برمجية تناسب ذوقك

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

=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))

حسنًا، يمكنك كتابة محلل بسيط عن طريق تجاهل معظم الأحرف والبحث فقط عن الأجزاء ذات الصلة (في هذا المثال:"A..Z" و"0..9" و"!:" وما إلى ذلك) ولكنك ستواجه مشكلات إذا كانت الوسيطات في "غير المباشرة" عبارة عن وظائف.

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

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

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

لست متأكدًا من آداب SO فيما يتعلق بذكر المنتجات التي يرتبط بها الكاتب، ولكن يمكن لـ OAK، وOperis Analysis Kit، وهي وظيفة إضافية في Excel، استبدال الوظائف غير المباشرة بمراجع الخلايا التي يحلون لها.يمكنك بعد ذلك استخدام أدوات تدقيق Excel لتحديد العناصر التابعة لكل نطاق.

يمكنك، بالطبع، القيام بذلك على نسخة مؤقتة من المصنف.

أكثر في

  • http://www.operisanalogykit.com/oakpruning.htm
  • http://www.operisanalogykit.com/help/2007/index.html?oakconceptpruning.htm

نظرًا لعمر هذا السؤال، ربما تكون قد وجدت حلاً بديلاً أو حلاً بديلاً.

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