التكرار عبر كافة الخلايا في Excel VBA أو VSTO 2005
سؤال
أحتاج ببساطة إلى استعراض جميع الخلايا الموجودة في جدول بيانات Excel والتحقق من القيم الموجودة في الخلايا.قد تحتوي الخلايا على نص أو أرقام أو تكون فارغة.لست على دراية أو راحة في العمل بمفهوم "النطاق".ولذلك، فإن أي رموز عينة سيكون موضع تقدير كبير.(لقد حاولت البحث في Google، لكن مقتطفات التعليمات البرمجية التي وجدتها لم تفعل ما أحتاجه تمامًا)
شكرًا لك.
المحلول
Sub CheckValues1()
Dim rwIndex As Integer
Dim colIndex As Integer
For rwIndex = 1 To 10
For colIndex = 1 To 5
If Cells(rwIndex, colIndex).Value <> 0 Then _
Cells(rwIndex, colIndex).Value = 0
Next colIndex
Next rwIndex
End Sub
وجدت هذا المقتطف على http://www.java2s.com/Code/VBA-Excel-Access-Word/Excel/Checksvaluesinarange10rowsby5columns.htm يبدو أنها مفيدة جدًا كدالة لتوضيح وسائل التحقق من القيم في الخلايا بطريقة مرتبة.
فقط تخيل أنها مصفوفة ثنائية الأبعاد من نوع ما وقم بتطبيق نفس المنطق للتكرار عبر الخلايا.
نصائح أخرى
إذا كنت تحتاج فقط إلى إلقاء نظرة على الخلايا المستخدمة، فيمكنك استخدام:
sub IterateCells()
For Each Cell in ActiveSheet.UsedRange.Cells
'do some stuff
Next
End Sub
سيؤدي ذلك إلى ضرب كل شيء في النطاق من A1 إلى الخلية الأخيرة التي تحتوي على بيانات (الخلية السفلية في أقصى اليمين)
إذا كنت تنظر فقط إلى قيم الخلايا، فيمكنك تخزين القيم في مصفوفة من النوع المتغير.يبدو أن الحصول على قيمة عنصر في مصفوفة يمكن أن يكون أسرع بكثير من التفاعل مع برنامج Excel، لذلك يمكنك رؤية بعض الاختلاف في الأداء باستخدام مصفوفة من جميع قيم الخلايا مقارنة بالحصول على خلايا مفردة بشكل متكرر.
Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value
ثم يمكنك الحصول على قيمة الخلية فقط عن طريق التحقق من ValArray(row, column)
يمكنك استخدام For Each للتكرار عبر كافة الخلايا الموجودة في نطاق محدد.
Public Sub IterateThroughRange()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Dim cell As Range
Set wb = Application.Workbooks(1)
Set ws = wb.Sheets(1)
Set rng = ws.Range("A1", "C3")
For Each cell In rng.Cells
cell.Value = cell.Address
Next cell
End Sub
بالنسبة لتطبيق VB أو C#، إحدى الطرق للقيام بذلك هي استخدام Office Interop.يعتمد هذا على إصدار Excel الذي تعمل معه.
بالنسبة لـ Excel 2003، تعتبر مقالة MSDN هذه مكانًا جيدًا للبدء.فهم نموذج كائن Excel من منظور مطور Visual Studio 2005
ستحتاج بشكل أساسي إلى القيام بما يلي:
- ابدأ تطبيق Excel.
- افتح مصنف Excel.
- قم باسترجاع ورقة العمل من المصنف بالاسم أو الفهرس.
- قم بالتكرار عبر كافة الخلايا الموجودة في ورقة العمل والتي تم استردادها كنطاق.
- نموذج مقتطف من التعليمات البرمجية (غير المختبرة) أدناه للخطوة الأخيرة.
Excel.Range allCellsRng;
string lowerRightCell = "IV65536";
allCellsRng = ws.get_Range("A1", lowerRightCell).Cells;
foreach (Range cell in allCellsRng)
{
if (null == cell.Value2 || isBlank(cell.Value2))
{
// Do something.
}
else if (isText(cell.Value2))
{
// Do something.
}
else if (isNumeric(cell.Value2))
{
// Do something.
}
}
بالنسبة لبرنامج Excel 2007، حاول مرجع MSDN هذا.
هناك عدة طرق لتحقيق ذلك، ولكل منها مزايا وعيوب؛أولاً وقبل كل شيء، ستحتاج إلى الحصول على مثيل لكائن ورقة العمل، ويعمل Application.ActiveSheet إذا كنت تريد فقط الكائن الذي يبحث عنه المستخدم.
يحتوي كائن ورقة العمل على ثلاث خصائص يمكن استخدامها للوصول إلى بيانات الخلية (الخلايا والصفوف والأعمدة) وطريقة يمكن استخدامها للحصول على كتلة من بيانات الخلية (get_Range).
يمكن تغيير حجم النطاقات وما إلى ذلك، ولكن قد تحتاج إلى استخدام الخصائص المذكورة أعلاه لمعرفة مكان حدود بياناتك.تصبح ميزة النطاق واضحة عند العمل بكميات كبيرة من البيانات لأن وظائف VSTO الإضافية تتم استضافتها خارج حدود تطبيق Excel نفسه، لذلك يجب تمرير جميع الاستدعاءات إلى Excel عبر طبقة ذات حمل؛يتيح لك الحصول على النطاق الحصول على/تعيين كافة البيانات التي تريدها في مكالمة واحدة، مما قد يكون له فوائد كبيرة في الأداء، ولكنه يتطلب منك استخدام تفاصيل واضحة بدلاً من التكرار خلال كل إدخال.
منشور منتدى MSDN هذا يعرض أحد مطوري VB.Net وهو يطرح سؤالاً حول الحصول على نتائج النطاق كمصفوفة
يمكنك بشكل أساسي التكرار عبر النطاق
احصل على ورقة
myWs = (Worksheet)MyWb.Worksheets[1];
احصل على النطاق الذي يهمك إذا كنت تريد حقًا التحقق من كل خلية، فاستخدم حدود Excel
يزيد Excel 2007 "GRID Big Grid" من الحد الأقصى لعدد الصفوف لكل ورقة عمل من 65،536 إلى أكثر من مليون ، وعدد الأعمدة من 256 (IV) إلى 16،384 (XFD).من هنا http://msdn.microsoft.com/en-us/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel
ومن ثم حلقة فوق النطاق
Range myBigRange = myWs.get_Range("A1", "A256");
string myValue;
foreach(Range myCell in myBigRange )
{
myValue = myCell.Value2.ToString();
}
في Excel VBA، ستمنحك هذه الوظيفة محتوى أي خلية في أي ورقة عمل.
Function getCellContent(Byref ws As Worksheet, ByVal rowindex As Integer, ByVal colindex As Integer) as String
getCellContent = CStr(ws.Cells(rowindex, colindex))
End Function
لذلك، إذا كنت تريد التحقق من قيمة الخلايا، فما عليك سوى وضع الوظيفة في حلقة، وإعطائها المرجع إلى ورقة العمل التي تريدها وفهرس الصف وفهرس العمود للخلية.يبدأ كل من فهرس الصف وفهرس العمود من 1، مما يعني أن الخلية A1 ستكون ws.Cells(1,1) وهكذا.
مهاراتي في VBA ضعيفة بعض الشيء، ولكن هذه هي الفكرة العامة لما سأفعله.
أسهل طريقة للقيام بذلك هي التكرار من خلال حلقة لكل عمود:
public sub CellProcessing()
on error goto errHandler
dim MAX_ROW as Integer 'how many rows in the spreadsheet
dim i as Integer
dim cols as String
for i = 1 to MAX_ROW
'perform checks on the cell here
'access the cell with Range("A" & i) to get cell A1 where i = 1
next i
exitHandler:
exit sub
errHandler:
msgbox "Error " & err.Number & ": " & err.Description
resume exitHandler
end sub
يبدو أن تسليط الضوء على بناء جملة الألوان لا يحب vba، ولكن نأمل أن يساعد هذا إلى حد ما (على الأقل يمنحك نقطة بداية للعمل منها).
- بريسكيتير