سؤال

لدي جدول بيانات بمتغيرين 100 × 100 في برنامج Excel.

أحتاج إلى دالة تُرجع جميع المجموعات الممكنة من المتغيرات التي تنتج قيمة مستهدفة معينة.ما أتطلع إليه هو نوع من وظيفة البحث المتكررة ثنائية الأبعاد.هل يستطيع احد توجيهي الي الوجهة الصحيحة؟

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

المحلول

يمكن القيام بذلك بدون VBA، بشكل مضغوط إلى حد ما، مثل ذلك.

لنفترض أن جدول 100×100 موجود في B2:CW101، وقمنا بوضع قائمة من الأرقام من 1 إلى 100 أسفل اليسار من A2 إلى A101، ومرة ​​أخرى من 1 إلى 100 عبر الجزء العلوي من B1 إلى CW1

أنشئ عمودًا من الخلايا بالأسفل، بدءًا (على سبيل المثال) من B104

 B104=MAX(($A$2:$A$101*100+$B$1:$CW$1<B103)*($B$2:$CW$101=TargetValue)*($A$2:$A$101*100+$B$1:$CW$1))

هذه صيغة "مصفوفة"، لذا اضغط على Ctrl-Shift-Enter بدلاً من Enter، ويجب أن تظهر الأقواس المتعرجة {} حول الصيغة.

ثم انسخ لأكبر عدد ممكن من الصفوف التي قد تحتاجها.تحتاج أيضًا إلى وضع رقم كبير فوق الصيغة الأولى، على سبيل المثال في B103، على سبيل المثال 999999.

ما تفعله الصيغة هو حساب Rowx100+Column، ولكن فقط لكل خلية ناجحة، وتبحث الدالة MAX عن النتيجة الأكبر، باستثناء جميع النتائج السابقة التي تم العثور عليها، أي أنها تجد النتائج المستهدفة واحدة تلو الأخرى، بدءًا من أسفل اليمين وتعمل حتى أعلى اليسار.(مع القليل من الجهد يمكنك جعله يبحث في الاتجاه الآخر).

سيعطيك هذا نتائج مثل 9922، وهو الصف 99 والعمود 22، ويمكنك بسهولة استخراج هذه القيم من الرقم.

نأمل أن يكون هذا منطقيا.

نصائح أخرى

وليس هناك وظيفة المدمج في التي من شأنها أن تفعل ما تريد، وأنا 99٪ واثق من ذلك.

ويمكن أن يبنى وظيفة VBA التي تقوم بإرجاع صفيف، على غرار اللجنة الفرعية سريعة وقذرة أظهرت بالفعل. إنشاء متغير لعقد الانتاج، وربما Redimmed إلى أقصى عدد ممكن من النتائج وRedim المحمية، د-وصولا الى العدد الفعلي في نهاية المطاف. ثم العودة أن نتيجة وظيفة الذي يحتاج بعد ذلك ليتم استدعاؤها دالة صفيف (مراقبة التحول أكتب).

والجانب السلبي واحد هو أن عليك أن تأكد من أن النطاق المستهدف كان كبيرا بما يكفي لاحتواء نتيجة كاملة: سيقوم Excel لا تفعل ذلك تلقائيا

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

وتنفيذ سريعة وقذرة هو كما يلي:

Dim arr As Range
Dim tempval As Range
Dim op As Integer

Set arr = Worksheets("sheet1").Range("b2:ao41")
op = 1
Range("B53:D153").ClearContents





For Each tempval In arr
If Round(tempval.Value, 0) = Round(Range("b50").Value, 0) Then

Range("b52").Offset(op, 0).Value = Range("a" & tempval.Row).Value
Range("b52").Offset(op, 1).Value = Cells(tempval.Column, 1).Value
Range("b52").Offset(op, 2).Value = tempval.Value
op = op + 1

End If

Next
Range("b50").Select

وأنا لا تزال تبحث عن النهج دون VBA.

ولقد حصلت على الحل التي لا تستخدم VBA، ولكن من الفوضى إلى حد ما. أنها تنطوي على خلق مزيد من الجدول بعد واحد في Excel والقيام عمليات البحث على ذلك. لجدول البيانات 100x100، سيحتاج الجدول الجديد 10،000 الصفوف.

والاعتذار إذا كان هذا لا يتناسب مع احتياجاتك.

وملخص أقل - اسمحوا لي أن أعرف إذا كنت بحاجة إلى المزيد من التفاصيل. N = البعد من البيانات، على سبيل المثال 100 في المثال الخاص بك.

أولا، إنشاء جدول جديد مع خمسة أعمدة وصفوف NxN. في كل حالة، واستبدال أسماء الأعمدة التي أجريتها مع الإشارة إكسل المناسبة

والعمود الأول (يطلق عليه INDEX) تسرد ببساطة 1، 2 ... NxN.

والعمود الثاني (DATAROW) يحتوي على صيغة لحلقة من خلال 1، 2 ... N، 1، 2 ... N ... ويمكن القيام بذلك باستخدام شيء من هذا القبيل = MOD (INDEX-1، N) + 1

والعمود الثالث (DATACOL) يحتوي على 1، 1، 1 ... 2، 2، 2 ... (N مرات لكل منهما). ويمكن القيام بذلك مع = INT ((INDEX-1) / N) +1

والعمود الرابع (VALUE) يحتوي على قيمة من جدول البيانات الخاص بك، وذلك باستخدام شيء من هذا القبيل: = OFFSET ($ A $ 1، DATAROW، DATACOL)، على افتراض جدول البيانات الخاص بك يبدأ في $ A $ 1

ولقد حصلت الآن على طاولة ذات بعد واحد يمسك جميع البيانات الخاصة بك.

والعمود الخامس (LOOKUP) يحتوي على الصيغة التالية: = MATCH (الهدف، أوفست (VALUERANGE، [LOOKUP-1]، 0)، 0) + [LOOKUP-1]

حيث يشير [LOOKUP-1] إلى الخلية مباشرة فوق (على سبيل المثال في F4 خلية وهذا يشير إلى F3). عليك ان تحصل على 0 فوق الخلية الأولى في عمود LOOKUP.

وVALUERANGE يجب ثابت (اسمه أو استخدام علامات $) إشارة إلى العمود القيمة بأكملها.

والعمود LOOKUP ثم يحمل أرقام INDEX التي يمكن استخدامها للبحث عن DATAROW وDATACOL العثور على موقف للمباراة في البيانات.

وهذا يعمل من خلال البحث عن مباريات في VALUERANGE، ثم البحث عن مباريات في مجموعة انطلاق المعدل بعد المباراة السابقة.

وانه من الاسهل بكثير في جدول ثم عن طريق التفسير أعلاه، ولكن هذا هو أفضل ما يمكن القيام به في الوقت الحالي ...

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