2016-11-21 9 views
2

Ich schreibe ein Skript, in dem ich eine Suche in einer Datenbank aktivieren und die Ergebnisse der Suchanfragen in einem anderen Arbeitsblatt (das ich Results genannt habe) darstellen soll Zugriff auf die gesamte Datenbank zur gleichen Zeit haben.Einfügen von Werten im dynamischen Bereich Excel VBA

Um dies zu tun, möchte ich Werte aus dem Arbeitsblatt "Datenbank" in das Arbeitsblatt "Ergebnisse" kopieren. Es ist mir gelungen, die richtigen Daten aus der "Datenbank" in Bezug auf bestimmte Suchkriterien auszuwählen. Ich tat dies mit dem folgenden Code:

With Sheets("Database") 
    .Range(.Cells(i, 1), .Cells(i, 9)).Copy 
End With 

Jetzt möchte ich die Ergebnisse in die „Ergebnisse“ Tabelle einfügen, und ich habe so getan, indem Sie das folgende Schreiben:

Sheets("Results").Range("B600").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 

Auf diese Weise I verstehe nicht ganz:

  • wenn ich den Pastenbereich genau zwischen der ersten leeren Reihe und B600 definiert habe oder;

  • Wenn ich nur den Anfang des Einfügebereichs definiere und die Suchergebnisse die 600. Zeile überschreiten, werden sie nach dieser Zeile eingefügt.

  • Ich frage dies, weil, wenn die Datenbank wächst, muss ich sicherlich eine Paste Bereich größer als B600 garantieren.

    Ich habe recherchiert, aber kann nicht absolut sicher sein, was ich genau gemacht habe. Ich muss sagen, dass ich weiß, dass die erste leere Zeile in der Datenbank "Results" immer 12 sein wird. In diesem Fall weiß ich, dass ich grundsätzlich die Suchergebnisse aus der 12. Zeile einfügen möchte. Vielleicht gibt es einen einfacheren Weg, dies zu tun.

    Dies ist der gesamte Code, als Referenz:

    Private Sub SearchButton_Click() 
    
    'This is the search function 
    
    '1. declare variables 
    '2. clear old search results 
    '3. Find records that match criteria and paste them 
    
    Dim country As String 
    Dim Category As String 
    Dim Subcategory As String 
    Dim finalrow As Integer 
    Dim i As Integer 'row counter 
    
    
    'Erase any entries from the Results sheet 
    Sheets("Results").Range("B10:J200000").ClearContents 
    
    'Deformat any tables in the Results sheet 
    For Each tbl In Sheets("Results").ListObjects 
        tbl.Clear 
    
        Next 
    
    'Define the user-inputed variables 
    country = Sheets("Results").Range("D5").Value 
    Category = Sheets("Results").Range("D6").Value 
    Subcategory = Sheets("Results").Range("D7").Value 
    finalrow = Sheets("Database").Range("A" & Rows.Count).End(xlUp).Row 
    
    'If statement for search 
    
    'For every variable i, start comparing from row 2 until the final row 
    For i = 2 To finalrow 
    
        'If the country field is left empty 
        If country = "" Then 
         Sheets("Results").Range("B10:J200000").Clear 
         MsgBox "You must select a country in order to search the database. Please do so in the drop-down list provided." 
         Sheets("Results").Range("D5").ClearContents 
         Sheets("Results").Range("D6").ClearContents 
         Sheets("Results").Range("D7").ClearContents 
         Exit Sub 
    
        'If the country field is filled in and there results from the search made 
        ElseIf Sheets("Database").Cells(i, 1) = country And _ 
         (Sheets("Database").Cells(i, 3) = Category Or Category = "") And _ 
         (Sheets("Database").Cells(i, 4) = Subcategory Or Subcategory = "") Then 
    
          'Copy the headers of the table 
          With Sheets("Database") 
          .Range("A1:I1").Copy 
          End With 
          Sheets("Results").Range("B10:J10").PasteSpecial 
    
          'Copy the rows of the table that match the search query 
          With Sheets("Database") 
          .Range(.Cells(i, 1), .Cells(i, 9)).Copy 
          End With 
          Sheets("Results").Range("B600").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 
    
        'Hides search form 
        Me.Hide 
    
        End If 
    
    Next i 
    
    'Toggle Results sheet 
    Sheets("Results").Activate 
    
    'Format results as a table 
    Set rng = Range(Range("B10"), Range("B10").End(xlUp).SpecialCells(xlLastCell)) 
    Set table = Sheets("Results").ListObjects.Add(xlSrcRange, rng, , xlYes) 
    table.TableStyle = "TableStyleMedium13" 
    
    Range("B11").Select 
    
    'Make Excel window visible 
    Application.Visible = True 
    
    End Sub 
    

    Ihnen sehr für Ihre Hilfe danken.

    +1

    werden Sie immer auf exakt den gleichen Bereich in der „Ergebnisse“ Arbeitsblatt einfügen sein? – user1

    +1

    und was ist der Bereich der Daten im Arbeitsblatt "Datenbank"? – user1

    +1

    'Sheets (" Ergebnisse "). Bereich (" B600 "). End (xlUp)' ist die erste Zelle über "B600", die Daten enthält. Die Frage ist, wo willst du ** die kopierten Daten einfügen? letzte belegte Reihe (unter "B600"), wo? –

    Antwort

    1
    • Zwei Listobjects tblDatabase und tblResults
    • tblResults Daten erhält
    • Ein Filter ist an dem zweiten, dritten und vierten Spalte von tblDatabase
    • Wenn es angewendet werden gelöscht weniger als 588 Ergebnisse kopieren wir das gefilterte Datensätze von tblDatabase bis tblResults
    • Wenn es mehr als 588 Ergebnisse gibt, dann ändern wir die Größe der gefilterten Datensätze auf die ersten 588 Datensätze und die n kopiere sie auf tblResults
    • Wir kümmern uns nie um Formatierung, weil tblResults behält sein Originalformat.

    Sub ListObjectDemo() 
        Dim tblDatabase As ListObject, tblResults As ListObject 
    
        Set tblDatabase = Worksheets("Database").ListObjects("tblDatabase") 
        Set tblResults = Worksheets("Results").ListObjects("tblResults") 
        If Not tblResults.DataBodyRange Is Nothing Then tblResults.DataBodyRange.ClearContents 
    
        With tblDatabase.Range 
         .AutoFilter Field:=2, Criteria1:="Test A" 
         .AutoFilter Field:=3, Criteria1:="East" 
         .AutoFilter Field:=4, Criteria1:="Algeria" 
        End With 
    
        With tblDatabase.DataBodyRange 
         If .Rows.Count <= 588 Then 
          .Copy tblResults.ListRows.Add.Range 
         Else 
          .Resize(588).Copy tblResults.ListRows.Add.Range 
         End If 
        End With 
    
    End Sub 
    
    2

    Sie können vom unteren Rand des Blattes bis zur zuletzt verwendeten Zelle in Spalte B und dann OFFSET in 1 Reihe zählen. Dies verhindert, dass Sie benötigen etwa

    Sorgen

    a), dass der Bereich von 12 bis beginnt, sich von Zeile einzufügen (sie sollten Werte enthalten) und

    b), die Sie verwenden derzeit eine hartcodierte ‚Anker‘ von B600, die aktualisiert werden müssen, wenn die Daten wachsen.

    Beispielcode:

    Dim ws As Worksheet 
    Dim rngColumnBUsed As Range 
    Dim lngFirstEmptyRow As Long 
    
    Set ws = ThisWorkbook.Sheets("Results") 
    Set rngColumnBUsed = ws.Range("B" & ws.Rows.Count).End(xlUp).Offset(1, 0) 
    lngFirstEmptyRow = rngColumnBUsed.Row 
    
    +1

    Warum mussten Sie eine 'Range' setzen und dann die Reihe daraus nehmen? Könntest du nicht einfach die letzte Zeile finden und 1 hinzufügen? 'lngFirstEmptyRow = ws.Cells (ws.Rows.Count," B "). Ende (xlUp) .Row + 1' –

    +2

    Ja, Ihr Beispiel ist prägnanter. Ich bin ein bisschen ein Trottel für das Schreiben von Code-Beispielen Schritt für Schritt :) –

    +0

    Vielen Dank für Ihre Antwort. Ich verstehe immer noch nicht, wie ich das in den Einfügen-Teil des Codes integrieren würde. Nachdem ich meinen Beispielcode in meinen geschrieben habe, wie würde ich das ändern ?: Ende mit Blätter ("Ergebnisse"). Bereich ("B600"). Ende (xlUp) .Offset (1, 0) .PasteSpecial xlPasteFormulasAndNumberFormats' – franciscofcosta

    1

    Dim search als Bereich, inputfromuser als String

    inputfromuser = InputBox ("Geben Sie, was Sie suchen wollen")

    Satz search = Blätter ("Datenbank") .find (inputuseruser) .select

    searchdata = activecell.value oder activecell.offset (10,5) .value

    Blätter ("Ergebnisse").aktivieren

    mit Blättern ("Ergebnis")

    Bereich ("a12", Bereich ("a12"). Ende (xlDown)). Versatz (1,0) .select

    searchdata.copy Ziel: = Active

    ActiveCell.Offset (1,0) .select

    Ende mit

    Nicht sicher, ob ich Sie corectly paaren verstanden.

    Ich habe kein Excel-Blatt oder VBE-Editor. Habe das direkt auf der Website geschrieben. Bitte ändern Sie nach Ihrem Bedarf.