كيفية التكرار على كافة فواصل الصفحات في ورقة عمل Excel 2003 عبر COM

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

سؤال

لقد كنت أحاول استرداد مواقع جميع فواصل الصفحات في ورقة عمل Excel 2003 معينة عبر COM.إليك مثال على نوع الشيء الذي أحاول القيام به:

Excel::HPageBreaksPtr pHPageBreaks = pSheet->GetHPageBreaks();
long count = pHPageBreaks->Count;
for (long i=0; i < count; ++i)
{
  Excel::HPageBreakPtr pHPageBreak = pHPageBreaks->GetItem(i+1); 
  Excel::RangePtr pLocation = pHPageBreak->GetLocation();

  printf("Page break at row %d\n", pLocation->Row);

  pLocation.Release();
  pHPageBreak.Release();
}
pHPageBreaks.Release();

أتوقع أن يؤدي ذلك إلى طباعة أرقام الصفوف لكل فواصل صفحات أفقية pSheet.المشكلة التي أواجهها هي أنه بالرغم من ذلك count يشير بشكل صحيح إلى عدد فواصل الصفحات في ورقة العمل، ويبدو أنني أستطيع استرداد الفواصل الأولى فقط.في الجولة الثانية من خلال الحلقة، الدعوة pHPageBreaks->GetItem(i) يطرح استثناءً، مع رقم الخطأ 0x8002000b، "فهرس غير صالح".

محاولة الاستخدام pHPageBreaks->Get_NewEnum() فشل الحصول على عداد للتكرار عبر المجموعة أيضًا مع نفس الخطأ، فورًا عند الاتصال بـ Get_NewEnum().

لقد بحثت حولي عن حل، وأقرب شيء وجدته حتى الآن هو http://support.microsoft.com/kb/210663/en-us.لقد حاولت تنشيط خلايا مختلفة خارج فواصل الصفحات، بما في ذلك الخلايا الواقعة خارج النطاق المراد طباعته مباشرةً، بالإضافة إلى الخلية اليمنى السفلية (IV65536)، لكن ذلك لم يساعد.

إذا كان بإمكان أحد أن يخبرني بكيفية جعل Excel يعيد مواقع جميع فواصل الصفحات في الورقة، فسيكون ذلك رائعًا!

شكرًا لك.

@جويل:نعم، لقد حاولت عرض واجهة المستخدم، ثم الإعداد ScreenUpdating إلى الحقيقة - أنتجت نفس النتائج.أيضًا، لقد قمت منذ ذلك الحين بتجربة مجموعات من الإعدادات pSheet->PrintArea إلى ورقة العمل و/أو الاتصال بالكامل pSheet->ResetAllPageBreaks() قبل مكالمتي للحصول على HPageBreaks جمع، الأمر الذي لم يساعد سواء.

@جويل:لقد استخدمت pSheet->UsedRange لتحديد الصف الذي سيتم التمرير إليه، ويقوم برنامج Excel بالتمرير بعد جميع الفواصل الأفقية، ولكن ما زلت أواجه نفس المشكلة عندما أحاول الوصول إلى الفواصل الثانية.ولسوء الحظ، فإن التبديل إلى Excel 2007 لم يساعد أيضًا.

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

المحلول

أثناء تجربة برنامج Excel 2007 من Visual Basic، اكتشفت أن فاصل الصفحات لا يُعرف إلا إذا تم عرضه على الشاشة مرة واحدة على الأقل.

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

إليك كود VBA...اسمحوا لي أن أعرف إذا كان لديك أي مشكلة في تحويل هذا إلى COM:

Range("A1").Select
numRows = Range("A1").End(xlDown).Row

While ActiveWindow.ScrollRow < numRows
    ActiveWindow.LargeScroll Down:=1
Wend

For Each x In ActiveSheet.HPageBreaks
    Debug.Print x.Location.Row
Next

قدم هذا الرمز افتراضًا واحدًا مبسطًا:

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

نصائح أخرى

هل قمت بتعيين ScreenUpdating على True، كما هو مذكور في مقالة قاعدة المعارف؟

قد ترغب في تبديله فعليًا إلى True لفرض إعادة رسم الشاشة.يبدو أن حساب فواصل الصفحات هو أحد الآثار الجانبية لعرض الصفحة فعليًا، وليس شيئًا يفعله Excel عند الطلب، لذلك يتعين عليك تشغيل عرض الصفحة على الشاشة.

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