سؤال

أحتاج ببساطة إلى استعراض جميع الخلايا الموجودة في جدول بيانات 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، ولكن نأمل أن يساعد هذا إلى حد ما (على الأقل يمنحك نقطة بداية للعمل منها).

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