الأحد، 08 أكتوبر 2017
  0 الردود
  3.1 ألف زيارة
0
الأصوات
فك
لدي ورقة عمل في مصنف يحتوي على أكثر من 400 صف و8 أعمدة و160 نطاقًا مدمجًا وقد أفسدت مظهرها. لقد بحثت في الإنترنت عن VBA Autofit Merged Cells. لا يوجد أي استخدام كبير لأي من عناوين URL. الماكرو في هذا الموقع يسير على الطريق الصحيح ولكن: -
1) يجب أن أقوم بتحديد وكتابة النطاقات المدمجة البالغ عددها 160 نطاقًا يدويًا.
أضفت بحثًا عن نطاقات الخلايا المدمجة.
2) يستخدم الصف الأول لإجراء حسابات الخلايا المدمجة (الخلية ZZ1). أستخدم خطًا أكبر بكثير في الخلية A1 (العنوان) مما يؤدي إلى حدوث أخطاء في حساب ارتفاع الاحتواء التلقائي المدمج المطلوب.
أستخدم خلية واحدة بعمود واحد لليمين وصف واحد أسفل البيانات. (Ctrl+Shift+End، لا يتم العثور على هذه الخلية)
3) يقوم بإعادة حساب جميع الخلايا المدمجة بحيث يقلل ارتفاع صفين يحتويان على الخلايا المدمجة والعادية مما يجعل الخلايا الطبيعية غير قابلة للقراءة.
أقوم بتغيير ارتفاع الصف فقط عندما يتجاوز الارتفاع المدمج المطلوب الارتفاع الحالي.
4) طريقة نسخ البيانات في النطاقات المدمجة إلى الخلية ZZ1 غير صحيحة، وتعتمد فقط على النص الموجود في النطاق المدمج ولكن دون مراعاة اختلاف أحجام الخطوط في الخلايا المدمجة المختلفة.
لقد صححت طريقة النسخ.
5) الماكرو بطيء: حوالي 15+ ثانية في ورقة العمل الخاصة بي.
يؤدي إيقاف تشغيل تحديث الشاشة وإعادة تشغيله في نهاية الماكرو إلى تقليل هذه المدة إلى ثانيتين.

تمكنت من العثور على خطأ مزعج آخر. الاحتواء التلقائي لورقة العمل (قبل تصحيح النطاقات المدمجة) وشوه عدة صفوف. بعض الخلايا "العادية"، التي تم ضبطها على الالتفاف، زاد ارتفاعها وكانت تظهر كسطر (أو سطرين) من النص مع صف فارغ أسفل النص. أشار البحث على الإنترنت إلى أن السبب هو قيام Excel بتغيير شاشة العرض لتتوافق مع خطوط الطابعة. وجدت "حل بديل"، أضفته إلى الماكرو:
زيادة عرض الأعمدة بنسبة مئوية صغيرة.
الاحتواء التلقائي لجميع الصفوف في ورقة العمل.
قم بإجراء التصحيحات على ارتفاع الصف لاستيعاب النطاقات المدمجة.
إعادة عرض العمود إلى الأحجام الأصلية.
تم حل المشكلة، ولم تعد الصفوف الفارغة تظهر الآن!

اعتقدت أن كل شيء أصبح صحيحًا الآن ولكني اكتشفت بعد ذلك مشكلة أخرى. إذا قمت بإغلاق المصنف وإعادة فتحه مرة أخرى، فستعود الصفوف الفارغة مرة أخرى. لقد نظرت إلى الملف/الخيارات وقمت بالبحث في الإنترنت عن طريقة لمنع المصنف من تحديث شاشة العرض عند إغلاق/فتح المصنف دون نجاح. اضطررت إلى إضافة Private Sub Workbook_Open() في علامة التبويب "ThisWorkbook" مع استدعاء لتشغيل الماكرو عند فتح المصنف.


الخيار صريح

نظرة فرعية 4 مدمجة ()
خافت WSN كسلسلة اسم ورقة العمل
Dim sht كورقة عمل "مستخدمة بواسطة "Set"
تعتيم LastRow As Long "الصف الأخير في كافة الأعمدة التي تحتوي على بيانات".
Dim LastRowCC As Long 'الصف الأخير في العمود الحالي الذي يحتوي على البيانات
Dim LastColumn As Integer 'رقم العمود الأخير في كافة الصفوف التي تحتوي على بيانات
Dim CurrCol كعدد صحيح 'رقم العمود الحالي
Dim Letter As String 'تحويل رقم CurrCol إلى سلسلة
Dim ILetter As String 'Index عمود واحد على يمين العمود الأخير
Dim ICell As String 'خلية بعمود واحد لليمين وصف واحد لأسفل منطقة بيانات frpm. يستخدم لحساب الارتفاع المدمج المطلوب
تعتيم CRow كرقم الصف الحالي الطويل
Dim TwN As Long 'معالجة الأخطاء
Dim TwD كسلسلة "معالجة الأخطاء".
Dim Mgd As Boolean 'اختبار صواب/خطأ إذا تم دمج الخلية
Dim MgdCellAddr As String 'يحتوي على نطاق مدمج كسلسلة
Dim MgdCellStart As String "حرف البداية لنطاق الخلايا المدمجة يستخدم على سبيل المثال فحص العمود B للخلايا المدمجة، وتجاهل أي خلايا مدمجة تبدأ في العمود A وتمتد إلى العمود B (تم تقييمها بالفعل)
Dim MgdCellStart1 كسلسلة تستخدم لحساب MgdCellStart
Dim MgdCellStart2 كسلسلة تستخدم لحساب MgdCellStart
Dim OldHeight As Single 'الارتفاع الحالي لجميع الصفوف في النطاق المدمج
خافت P1 كعدد صحيح "عدد الحلقات/المؤشر
Dim OldWidth As Single 'العرض الحالي للخلايا في النطاق المدمج
Dim NewHeight As Single 'الارتفاع المطلوب لجميع الصفوف في النطاق المدمج. قم بتحديث الصفوف الفردية بشكل متناسب إذا تجاوزت OldHeight
Dim C1 كعدد صحيح لعدد أعمدة الحلقة
خافت R1 كعدد/مؤشر لصفوف الحلقة الطويلة
Dim Tweak As Single 'زيادة صغيرة في عرض العمود للتغلب على مشكلة الصف الفارغ
برتقالي خافت كنطاق
على خطأ انتقل إلى TomsHandler

Application.ScreenUpdating = False 'أسرع بكثير لمدة 15 ثانية إذا تم تحديث الشاشة بعد ثانيتين فقط.
Tweak = 1.04 'زيادة عرض العمود بنسبة 4% قبل الاحتواء التلقائي لجميع الصفوف.
WSN = ActiveSheet.Name
Columns("A:A").EntireRow.Hidden = False

"البحث عن آخر صف وعمود نشطين في ورقة العمل بأكملها مع البيانات."
مع ActiveSheet.UsedRange
LastColumn = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder: = xlByColumns ، SearchDirection: = xlPrevious).
LastRow = Range(Range("A1"), Cells(Rows.Count, Columns.Count)).Find(What:="*", LookIn:=xlValues, _
SearchOrder:=xlByRows، SearchDirection:=xlPrevious).Row
انتهت ب
CurrCol = LastColumn + 1 'أي على يمين العمود الأخير
إذا CurrCol <27 ثم
ILetter = Chr$(CurrCol + 64) 'عمود الفهرس
آخر
ILetter = Chr$(Int((CurrCol - 1) / 26) + 64)
ILetter = ILetter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64) 'عمود الفهرس إذا كان الرقم مزدوجًا. لم يزعجك الحرف الثلاثي
إنهاء حالة

'يقع Icell على يمين البيانات وأسفلها. يتم استخدام الخلية لحساب الارتفاع المطلوب لملاءمة النطاق المدمج
ICell = ILetter وLastRow + 1

'قم بزيادة عرض العمود بمقدار صغير لعلاج خطأ التفاف الصف الفارغ.
النطاق ("أ" والصف الأخير + 1).حدد
بالنسبة لـ C1 = 1 إلى LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth * قم بتعديل عرض العمود بمقدار صغير لعلاج الخطأ
ActiveCell.Offset(0, 1).Range("A1").حدد "حرك خلية واحدة لليمين"
التالى

"الاحتواء التلقائي للصفوف (يتجاهل الصفوف المدمجة) مع عرض عمود إضافي بنسبة 4% لمنع حدوث خطأ في الصفوف الفارغة في بعض صفوف الالتفاف"
الخلايا
Selection.Rows.AutoFit
Set sht = Worksheets(WSN) 'مطلوب للعثور على آخر إدخال في العمود الذي يحتوي على البيانات

بالنسبة لـ CurrCol = 1 إلى LastColumn
'تحويل رقم العمود الحالي إلى ألفا (إما حرف مفرد أو مزدوج)
إذا CurrCol <27 ثم
الرسالة = Chr$(CurrCol + 64)
آخر
الرسالة = Chr$(Int((CurrCol - 1) / 26) + 64)
Letter = Letter & Chr$(CurrCol - Int((CurrCol - 1) / 26) * 26 + 64)
إنهاء حالة
LastRowCC = sht.Cells(sht.Rows.Count, Letter).End(xlUp).Row 'ابحث عن الصف الأخير في العمود الحالي

بالنسبة لـ CRow = 1 إلى LastRowCC
النطاق (حرف وكرو). اختر
Mgd = ActiveCell.MergeCells 'هل الخلية موجودة في النطاق المدمج
إذا كان Mgd = صحيح، ثم "إذا كان صحيحًا، فهو كذلك".
'ما هو عنوان النطاق المدمج؟ استخراج رقم واحد/مزدوج لبداية النطاق
MgdCellAddr = ActiveCell.MergeArea.Address
MgdCellStart1 = Mid(MgdCellAddr, 2, 1)
MgdCellStart2 = Mid(MgdCellAddr, 3, 1)
إذا كان MgdCellStart2 = "$" إذن
MgdCellStart = MgdCellStart1
آخر
MgdCellStart = MgdCellStart1 & MgdCellStart2
إنهاء حالة
إذا كان MgdCellStart = Letter إذن، فإن العمود الأول للخلية المدمجة يساوي العمود الحالي
مع الأوراق (WSN)
العرض القديم = 0
تعيين oRange = Range(MgdCellAddr) 'تم اكتشاف تعيين oRange على النطاق المدمج
بالنسبة لـ C1 = 1 إلى oRange.Columns.Count
OldWidth = OldWidth + .Cells(1, oRange.Column + C1 - 1).ColumnWidth 'تجميع عرض الأعمدة لنطاق الخلايا (مع إضافة 4%)
التالى
الارتفاع القديم = 0
بالنسبة لـ R1 = 1 إلى oRange.Rows.Count
OldHeight = OldHeight + .Cells(CRow, oRange.Row + R1 - 1).RowHeight 'تجميع ارتفاع الصف الموجود لنطاق الخلايا
التالى
oRange.MergeCells = خطأ
.Range(Letter & CRow).Copy Destination:=Range(ICell) 'نسخ حجم النص والخط، وليس القيم فقط
.Range(ICell).WrapText = صحيح 'التفاف ICell
.Columns(ILetter).ColumnWidth = OldWidth 'تغيير عرض العمود الذي يحتوي على ICell لتقليد النطاق الموجود
.Rows(LastRow + 1).EntireRow.AutoFit 'الاحتواء التلقائي لصف ICell، جاهز لقياس الارتفاع المدمج المطلوب
oRange.MergeCells = True 'أعد ضبط النطاق المدمج مرة أخرى إلى النطاق المدمج
oRange.WrapText = True 'والتفاف
'قياس الارتفاع المطلوب للنطاق المدمج
NewHeight = .Rows(LastRow + 1).RowHeight
'هل الارتفاع المطلوب الجديد يتجاوز الارتفاع القديم الموجود؟
إذا NewHeight> OldHeight ثم
بالنسبة لـ R1 = CRow إلى CRow + oRange.Rows.Count - 1
'قم بزيادة كل صف في النطاق بالتناسب
النطاق (ILetter & R1).RowHeight = النطاق (ILetter & R1).RowHeight * NewHeight / OldHeight
التالى
آخر
'مساحة كافية في الخلية المدمجة
إنهاء حالة
CRow = CRow + oRange.Rows.Count - 1 'آخر في نطاق متعدد الصفوف، سوف ينزل إلى الصف الثاني من النطاق ويكرر الحساب عند الوصول إلى "التالي"
.Range(ICell).امسح 'Zap ICell جاهز للحساب التالي
.Range(ICell).ColumnWidth = 8.1 'ترتيب عرض العمود
انتهت ب
إنهاء حالة
إنهاء حالة
التالى
التالى

'إعادة تعيين عرض العمود مع إزالة 4% المضافة (مطلوب لمعالجة خطأ الالتفاف)
النطاق ("أ" والصف الأخير + 1).حدد
بالنسبة لـ C1 = 1 إلى LastColumn
ActiveCell.ColumnWidth = ActiveCell.ColumnWidth / قرص "تقليل عرض العمود إلى الأصل"
ActiveCell.Offset(0, 1).Range("A1").حدد خلية واحدة لليمين
التالى
النطاق ("A1"). حدد

Application.ScreenUpdating = True 'قم بتشغيل التحديث مرة أخرى
خروج الفرعية

تومزهاندلر:
Application.ScreenUpdating = True 'قم بتشغيل التحديث مرة أخرى
TwN = رقم الخطأ
TwD = خطأ.الوصف
MsgBox "بحاجة إلى معالجة الخطأ " & TwN & " " & TwD
قلة النوم
سيرة ذاتية
نهاية الفرعية

هل من الممكن منع Excel من تغيير مظهر شاشة العرض عند إغلاق/إعادة فتح المصنف؟
لا توجد ردود لهذا المنصب حتى الآن.