programing

Excel VBA 또는 VSTO 2005의 모든 셀에서 반복

skycolor 2023. 4. 17. 21:38
반응형

Excel VBA 또는 VSTO 2005의 모든 셀에서 반복

Excel 스프레드시트의 모든 셀을 살펴보고 셀의 값을 확인하기만 하면 됩니다.셀에는 텍스트, 숫자를 포함하거나 공백으로 둘 수 있습니다.저는 '범위'라는 개념을 사용하는 것이 익숙하지 않습니다.따라서 어떤 샘플 코드라도 매우 감사하겠습니다.(구글을 검색하려고 했지만 찾은 코드 조각이 제대로 작동하지 않았습니다.)

감사해요.

사용 중인 셀만 확인할 필요가 있는 경우 다음을 사용할 수 있습니다.

sub IterateCells()

   For Each Cell in ActiveSheet.UsedRange.Cells
      'do some stuff
   Next

End Sub

A1부터 마지막 셀(오른쪽 맨 아래 셀)까지의 범위에 있는 모든 것을 대상으로 합니다.

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에서 찾았습니다.셀의 값을 순서대로 체크하는 방법을 설명하는 기능으로서 매우 도움이 될 것 같습니다.

2D 배열이라고 생각하고 같은 논리를 적용하여 셀을 루프합니다.

셀 값만 보고 있다면 값을 변형 유형 배열에 저장할 수 있습니다.배열 내의 요소 값을 가져오는 것이 Excel과 상호 작용하는 것보다 훨씬 빠를 수 있기 때문에 모든 셀 값의 배열을 사용하여 단일 셀을 반복적으로 가져오는 것과 비교하여 성능의 차이를 알 수 있습니다.

Dim ValArray as Variant
ValArray = Range("A1:IV" & Rows.Count).Value

그러면 ValArray( 행, 열)를 체크하는 것만으로 셀 값을 얻을 수 있습니다.

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 기사를 참조해 주세요.Visual Studio 2005 개발자의 관점에서 Excel 객체 모델 이해

기본적으로 다음 작업을 수행해야 합니다.

  • 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 레퍼런스를 사용해 주세요.

이를 위해서는 여러 가지 방법이 있으며 각각 장점과 단점이 있습니다. 우선 워크시트 개체인 응용 프로그램의 인스턴스가 필요합니다.ActiveSheet 는, 유저가 보고 있는 것만으로 동작합니다.

워크시트 개체에는 셀 데이터에 액세스하는 데 사용할 수 있는 세 가지 속성(셀, 행, 열)과 셀 데이터 블록을 가져오는 데 사용할 수 있는 방법(get_Range)이 있습니다.

범위는 크기를 조정할 수 있지만, 데이터의 경계를 확인하려면 위에서 설명한 속성을 사용해야 할 수 있습니다.VSTO 애드인은 Excel 애플리케이션 자체의 경계 밖에서 호스트되기 때문에 대량의 데이터를 사용하는 경우 Range의 이점이 명확해집니다.따라서 Excel에 대한 모든 콜은 오버헤드가 있는 레이어를 통과해야 합니다.Range를 취득하면 원하는 모든 데이터를 1회의 콜로 취득/설정할 수 있기 때문에 퍼포먼스가 크게 향상되지만 각 엔트리를 반복하는 것이 아니라 명시적인 세부사항을 사용해야 합니다.

이 MSDN 포럼의 투고는 VB를 나타내고 있습니다.Range 결과를 어레이로 가져오는 방법에 대한 질문을 하는 넷 개발자

기본적으로 레인지 상에서 루프할 수 있습니다.

시트를 입수하다

myWs = (Worksheet)MyWb.Worksheets[1];

원하는 범위 선택 Excel의 제한을 사용하는 모든 셀을 확인하고 싶은 경우

Excel 2007 "Big Grid"에서는 워크시트당 최대 행 수를 65,536개에서 100만 개 이상으로 늘리고 열 수를 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가 됩니다.셀(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를 좋아하지 않는 것 같습니다만, 이것이 어느 정도 도움이 될 것입니다(적어도 작업 시작점이 될 수 있습니다).

  • 브리스킷테어

언급URL : https://stackoverflow.com/questions/73785/iterating-through-all-the-cells-in-excel-vba-or-vsto-2005

반응형