>

Delphi Tokyo, Excel 2016. Delphi 프로그램을 사용하여 Excel을 제어하고 있습니다. 특정 열에 특정 값이있는 단일 시트 EXCEPT 행의 모든 ​​행을 삭제하려고합니다 ... 예를 들어 3 열이 비즈니스의 도시 인 비즈니스 목록이 있습니다. City in ( 'Chicago', 'Denver', 'Columbus')를 제외한 모든 행을 삭제해야합니다. Excel에서 어떻게 작동하는지 확인하기 위해 Excel 매크로를 작성하고 보았습니다 .... 특히, 자동 필터를 설정하고 해당 도시를 제외한 모든 값을 선택한 다음 삭제합니다. 내가 가진 질문은 ...이 열의 값이 무엇인지 어떻게 알 수 있습니까?

VBA 매크로 코드는 다음과 같습니다 ...

Selection.AutoFilter
    ActiveSheet.Range("$A$1:$AF$66").AutoFilter Field:=3, Criteria1:=Array( _
        "ADDISON", "CARROLLTON", "DALLAS", "DANBURY", "EDEN PRAIRIE", "EL PASO", "ELDRIDGE", _
        "FARMERS BRANCH", "Franklin", "GEISMAR", "GRAPEVINE", "HOUSTON", "KROTZ SPRINGS", _
        "MASON CITY", "NEW BRAUNFELS", "PALO ALTO", "PLANO", "POWAY", "PURCHASE", _
        "RICHARDSON", "SAINT PAUL", "SAN ANTONIO", "SOUTHLAKE", "SUNNYVALE", "THE WOODLANDS" _
        , "ULYSSES", "WEST LAKE HLS"), Operator:=xlFilterValues   
    Rows("2:62").Select
    Selection.Delete Shift:=xlUp
    ActiveSheet.ShowAllData

필요한 것은 삭제하려는 도시를 제외한 모든 도시의 배열을 만드는 것입니다. 자동 필터는 모든 고유 값이 무엇인지 알고 있습니다. 모든 행을 반복하는 것 이외의 자동 필터 (일명 고유 값 목록)는 어떻게 읽습니까?

  • 답변 # 1

    와이즈 비즈

    자동 필터에서 고유 한 값을 읽을 수 있다고 생각하지 않습니다. 필터의 정의 된 속성을 보면 고유 한 값이 아니라 필터가 작동하는 셀 범위뿐입니다.

    아마도 가장 가까운 것은 필터링 된 범위의 어떤 행이 화면에 표시되는지 확인한 다음 그렇지 않은 행을 삭제하는 것입니다. 이 코드는 숨길 행을 결정하는 방법을 보여줍니다. 그러나 그것은 저에게 "집 주변"인 것 같습니다. 어쨌든 당신이 구체적으로 요구 한 것은 아닙니다.

    그래서 어떻게 든 범위를 직접 반복해야합니다.

    와이즈 비즈

    Dellel 코드를 사용하여 Excel 범위에서 고유 한 셀 값을 찾는 것은 거의 쉽지 않기 때문에 Excel 자동 필터를 무시하면 Delphi 코드에서 실제로훨씬더 쉽습니다.

    아래에서는이 답변에서 Coderre의 공식과 동등한 Delphi를 수행하는 방법을 보여 드리겠습니다. 당신이 원하는 당신에게 달려 있습니다.

    새로운 Delphi VCL 프로젝트를 시작하고 TCheckListBox를 드롭하십시오. 그런 다음 컴파일하고 아래 코드를 실행하십시오. 이 코드는 Excel 범위를 A, B&C와 같은 값으로 채 웁니다. 그런 다음 고유 값을 추출하고 ChecklistBox를 해당 값으로 채 웁니다. 그 후 개별 확인란의 상태를 사용하여 Excel 범위를 처리 할 수 ​​있습니다. 당신이 원하는 방식으로.

    The AutoFilter knows what all unique values are... How do I read the Autofilter

    Btw, Excel의 자동화 개체에 대한 가져 오기 단위 중 하나를 보는 경우 (예 : Excel2000.Pas에는 IAutoFilter 인터페이스가 정의되어 있으므로 원하는 경우 Delphi 코드에서 해당 인터페이스에 액세스 할 수 있습니다.

    또한이 작업을 직접 수행하는 경우 TAdoQuery와 같은 ADO 개체를 사용하여 스프레드 시트에 액세스하여 SQL에서 데이터 조작을 수행 할 수 있습니다. "일부 열 값이 목록에없는 모든 행 삭제 "의 가치"는 그런 종류의 치료를 요구합니다.

  • 답변 # 2

    들었 듯이, 독특한 값은

    What I need to do is to build an array of ALL cities EXCEPT the ones I want to delete.

    에서 구할 수 없습니다 , 달성하려는 수동 필터링 설정의 기능을 모방하는 것이 다소 복잡해졌습니다.

    내 제안은 vExcel, vWorkBook, vSheet, vRange : OleVariant; procedure GetUniqueValues(vRange : OleVariant; Strings : TStrings); // scans the Excel range represented by vRange and populates the Strings // variable with the unique values for in the range's Cells var S : String; Row, Col : Integer; begin Strings.BeginUpdate; Strings.Clear; try for Row := 2 to vRange.Rows.Count do begin for Col := 1 to vRange.Columns.Count do begin S := vRange.Cells[Row, Col].Value; if Strings.IndexOf(S) < 0 then Strings.Add(S); end; end; finally Strings.EndUpdate; end; end; procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin vExcel := CreateOleObject('Excel.Application'); vExcel.Visible := True; // Create a new workbox and populate two columns in it with random // character data vWorkBook := vExcel.WorkBooks.Add; vSheet := vWorkBook.ActiveSheet; vSheet.Range['A1'].Value := 'City'; for i := 1 to 20 do begin vSheet.Range['A' + IntToStr(1 + i)].Value := Chr(Random(3) + Ord('A')); vSheet.Range['B' + IntToStr(1 + i)].Value := Chr(Random(4) + Ord('A')); end; // Extract the range A2..B21 vRange := vSheet.Range['A2', 'B21']; // Set CheckListBox1 to sort its contents CheckListBox1.Sorted := True; // Now get the unique values GetUniqueValues(vRange, CheckListBox1.Items); // Do whatever you like with tthe results for i := 0 to CheckListBox1.Items.Count - 1 do begin if not (CheckListBox1.State[i] = cbChecked) then ; end; end; 를 사용하는 것입니다   AutoFilter 대신 . 필터링 기준을 정의하는보다 간단한 방법이 있습니다.

    Delphi에서 호출 할 매크로는 다음과 같습니다.

    Range.AdvancedFilter
    
    

    이것은 Range.AutoFilter 에있는 데이터와 일치하여 재생됩니다  그리고 당신이 Public Sub UseAdvancedFilter() Dim MyRange As Range Set MyRange = Range("A1").CurrentRegion Range(MyRange.Address).AdvancedFilter _ Action:=xlFilterInPlace, _ CriteriaRange:=Range("A28:C29") Rows("2:" & MyRange.Rows.Count).Select Selection.Delete Shift:=xlUp ActiveSheet.ShowAllData End Sub 에있는 기준 .

    (분할보기를 사용하여 이미지 크기를 줄였습니다. 4와 19 사이의 모든 행에는 데이터가 있습니다)

    더 많은 열이 있지만 파일러가이 세 열에서 어떻게 작동하는지 보여줄 수 있습니다. 데이터 범위 ( MyRange )에는 데이터 제목이 포함되어야합니다. 도시 필드의 제목, CriteriaRange   MyRange 의 제목과 일치 .

    와이즈 비즈  흥미로운 것입니다. 우리는 모두 City 와 함께 세 개의 표제 셀을 가지고 있습니다.  분야 명. 그런 다음 세 가지 기준이 있습니다 : CriteriaRange CriteriaRange  그리고 City . 동일한 행에있는 기준은 논리적 인 <>Denver 를 형성합니다.  그들과 <>Chicago 사이의 기능  물론 수단 . 따라서 선택 기준은 <>Dallas 가됩니다. .

    결과는 수동 AND 와 매우 유사합니다  테스트하십시오.

    와이즈 비즈  프로시 저는 공용 모듈에 배치되며 다음과 같이 Delphi에서 직접 호출 할 수 있습니다.

    <>
    
    

    보안 설정이이를 금지하지 않는다고 규정했습니다.

    <시간>

    위의 솔루션은 원치 않는 모든 데이터 행을 삭제한다는 아이디어를 따릅니다. 원치 않는 데이터를 삭제하고 싶지 않고 숨길 필요가있는 경우 원하는 데이터를 복사하기 위해 위와 같이 변경할 수 있습니다.

    기준 범위를 다음으로 변경

    not equal to
    
    

    예, 하나의 열만 있습니다. 다른 행의 기준은 논리적 인 select records where City is not Denver and City is not Chicago and City is not Dallas 를 형성합니다.  그들 사이의 기능. 따라서 선택은

    AutoFilter
    
    

    그런 다음, 매크로가 선택 항목 인 f.ex로 수행하는 작업을 변경해야합니다.

    Public UseAdvancedFilter
    
    

    추가 처리를 위해 선택한 레코드를 대상에 복사합니다.

    Excel.Run('UseAdvancedFilter');

관련 자료

  • 이전 java - Firestore 모음의 이미지로 RecyclerView를 채 웁니다
  • 다음 android - 주문 된 방송을 보낼 때 FLAG_RECEIVER_FOREGROUND의 기능은 무엇입니까?