2017-08-25 1 views
0

Anstatt Zellen kopieren, auswählen und einfügen (unterer Code), möchte ich Bereiche direkt zuweisen und das Blatt ausblenden, auf das Werte gefüllt werden.Wie Sie mit Excel VBA Werte von einem Blatt in ein ausgeblendetes Blatt zuweisen? (und eine Spalte innerhalb des Bereichs auslassen?)

Ich denke, das Blatt kann einfach aus der Sicht ausgeblendet werden und das Makro, um die Werte basierend auf anderen Blattbereichen zu füllen, wird immer noch funktionieren, oder?

Beim Versuch, Werte auf einem anderen Blatt zuzuweisen, möchte ich auf diesem Arbeitscode aufbauen (mit thanks to Jason Faulkner and aoswald). (Ich muss die Zellen nach einer leeren Spalte aus der letzten Menge von Werten platzieren. Idealerweise weist der Code Werte von A13: C## (bis zur letzten gefüllten Zeile) und ebenfalls E13: E ## unmittelbar danach zu (dh Entfernen der Spalte D .., wenn die Werte auf das versteckte Blatt zuweisen)

Private Sub CommandButton1_Click() 
Dim DataRange As Variant, Constraint_sheet As Worksheet, Private_sheet As Worksheet 
Set Constraint_sheet = Sheets("Constraint Sheet") 
Set Private_sheet = Sheets("Private") 
DataRange = Constraint_sheet.Range("A13:C300").Value 
With Private_sheet 
    .Range(.Range("XFD1").End(xlToLeft).Offset(0, 3), .Range("XFD1").End(xlToLeft).Offset(287, 2)) = DataRange 
End With 
End Sub 

Hier Code arbeitet, die ich zu ersetzen versuchen und zu vereinfachen, wie oben angegeben gibt es weitere Vereinfachungen, die gemacht werden können

Private Sub CommandButton1_Click() 
    Dim MyPassword As String, Private_sheet As Worksheet 
    Set Private_sheet = Sheets("Private") 
    MyPassword = "string" 
    If InputBox("Please enter the password to continue.", "Enter Password") <> MyPassword Then 
    Exit Sub 
    End If 

    Private_sheet.Unprotect MyPassword ' apparently causes clipboard to be erased so do before copying cells 

    Columns("B:E").Select 
    Application.CutCopyMode = False 
    Selection.Copy 

    Private_sheet.Select 
Private_sheet.Range("XFD1").End(xlToLeft).Offset(0, 3).Select 
ActiveCell.PasteSpecial 
ActiveCell.CurrentRegion.EntireColumn.Locked = True 
ActiveCell.CurrentRegion.Offset(0, -1).EntireColumn.Locked = True 
Private_sheet.Protect MyPassword 

    ActiveWorkbook.Save 

End Sub 

bearbeiten?: Hier ist der Arbeitscode, den ich entwickelt habe, um den obigen Code zu ersetzen.Welche weiteren Verbesserungen und Vereinfachungen können vorgenommen werden?

Private Sub AddTemplate_Click() 
Dim Exposed_sheet As Worksheet, Hidden_sheet As Worksheet, MyPassword As String 

Set Exposed_sheet = Sheets("Exposed Sheet") 
Set Hidden_sheet = Sheets("Hidden") 

    MyPassword = "string" 
    'Reference: carriage return in msgbox http://www.ozgrid.com/forum/showthread.php?t=41581 
    If InputBox("Please enter the password to continue." & vbNewLine & vbNewLine _ 
    & "Note: The string you type will be exposed, i.e. not '***'." & vbNewLine _ 
    & "Note: This will save the Excel file!", "Enter Password: Enter the correct string.") <> MyPassword Then 
    Exit Sub 
    End If 

' Reference: .Protect - https://stackoverflow.com/questions/11746478/excel-macro-run-time-error-1004 
    Hidden_sheet.Unprotect MyPassword 

'References: 
' dynamic referencing: https://stackoverflow.com/questions/45889866/how-to-assign-values-from-one-sheet-into-hidden-sheet-using-excel-vba-and-skip/45889960#45889960 
' adding text:   https://stackoverflow.com/questions/20612415/adding-text-to-a-cell-in-excel-using-vba 
' Union to exclude column: https://stackoverflow.com/questions/2376995/exclude-some-columns-while-copying-one-row-to-other 
With Hidden_sheet 
    .Cells(1, Columns.Count).End(xlToLeft).Offset(1, 3).Resize(UBound(Exposed_sheet.Range("B6", "D9").Value, 1), UBound(Exposed_sheet.Range("B6", "D9").Value, 2)).Value = Exposed_sheet.Range("B6", "D9").Value 
    .Cells(1, Columns.Count).End(xlToLeft).Offset(1, 6).Value = "Volume/Protocol" 
    .Cells(1, Columns.Count).End(xlToLeft).Offset(6, 3).Resize(UBound(Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value, 1), UBound(Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value, 2)).Value = Union(Exposed_sheet.Range("A13:C300"), Exposed_sheet.Range("E13:E300")).Value 
    ' If you change the order putting this prior, you must change the offsets or the cell they count from. -- DB, Aug 28 2017 
    .Cells(1, Columns.Count).End(xlToLeft).Offset(0, 3).Resize(1, 3).Merge 
    .Cells(1, Columns.Count).End(xlToLeft).Offset(0, 3).Value = Exposed_sheet.Range("A1").Value 
End With 

Hidden_sheet.Protect MyPassword 

ActiveWorkbook.Save 

End Sub 

Antwort

0

Ihr Problem ist, dass (in einem normalen Code-Modul) Range(), Cells() immer die ActiveSheet verweisen, wenn Sie ein Arbeitsblatt Qualifier enthalten

Private_sheet.Range(Range("XFD1").End(xlToLeft).Offset(0, 3), _ 
        Range("XFD1").End(xlToLeft).Offset(287, 2)) = DataRange 

Also auch wenn die äußere Range()-Private_sheet scoped ist, dass führt nicht zu den inneren Range Rufe "durch".

Sollte so etwas wie:

With Private_sheet 
    .Range(.Range("XFD1").End(xlToLeft).Offset(0, 3), _ 
      .Range("XFD1").End(xlToLeft).Offset(287, 2)) = DataRange 
End With 

Bit einfacher/flexibler:

'EDITED 
Private_sheet.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 3) _ 
    .Resize(UBound(DataRange, 1), UBound(DataRange, 2)).Value = DataRange 

In einem Blatt Codemodul Bereich Verweise auf dieses Blatt Standard, aber es ist immer noch eine gute Praxis zu qualifizieren mit einem Blattobjekt (zB) Me.Range()

+0

Was für eine aktive Community und schnelle Antwort! Du hast diese Antwort gepostet, bevor ich mein OP bearbeiten konnte, um dieselbe Lösung zu implementieren, die ich in verwandten Fragen gefunden habe. Ich hoffe immer noch auf weitere Verbesserungen dieses Codes. (Ich werde das OP, sobald ich eine vollständigere Implementierung habe, die den letzteren Code vereinfacht.) – DBinJP

+0

Wenn ich diesen 'einfacheren/flexibleren' Code versuche, bekomme ich den Fehler 'Laufzeitfehler 424: Objekt benötigt'. Ich frage mich, ob DataRange für ein anderes Arbeitsblatt mit 'mit' definiert wurde und irgendwie diese Verbindung verloren ging, wenn sie in einem anderen 'mit' verwendet wurde (d. H. 'Mit' Angabe eines anderen Blattes). Aber wenn ich das Blatt, sheetame.DataRange, spezifiziere, wird 'Methode oder Datenelement nicht gefunden' angezeigt. – DBinJP

+0

Ja, das habe ich vermasselt und vergessen, 'DataRange' war ein Array und kein Bereich. Siehe oben Bearbeiten. –

Verwandte Themen