2017-08-25 9 views
0

コピー選択貼り付けセル(下位コード)ではなく、範囲を直接割り当てて、値が埋め込まれるシートを非表示にしたいと考えています。Excel VBAを使用して1枚のシートから隠しシートに値を割り当てる方法は? (範囲内の列をスキップしますか?)

私はシートを単に見えないようにすることができ、別のシートの範囲に基づく値を埋めるためのマクロはまだ機能すると思いますか?

別のシートに値を割り当てようとしていますが、この作業コード(thanks to Jason Faulkner and aoswald)をベースにしています。 (最後の値を入力して空白列の後にセルを置く必要があります。理想的には、A13:C##(最後に塗りつぶした行まで)と同様にE13:E ##の値を代入します。隠されたシートに値を割り当てるとき)

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 

をここに私は上記のように置き換えると簡素化しようとしている作業コードがある行うことができますが、追加の簡略化

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 

編集されています。?:上記のコードを置き換えるために開発した作業コードは次のとおりです。さらに改善と簡略化が可能なのは

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 

答えて

0

あなたの問題は、あなたが

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

だから、外Range()Private_sheetにスコープされていても、そのワークシート修飾子を含まない限り、Range()(通常のコードモジュールに)、Cells()は常にActiveSheetを参照するということです内部のRangeコールに「キャリースルー」しません。より柔軟な/シンプルな

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

ビット:

のようなものであるべきシートのコードモジュールで

​​

、範囲の参照は、そのシートにデフォルト設定されますが、それはまだ資格をすることをお勧めしますシートオブジェクト(例:Me.Range()

+0

どのようなコミュニティでも迅速な対応が可能です!関連する質問で見つけたこの同じソリューションを実装するためにOPを編集する前に、この回答を投稿しました。私はまだこのコードをさらに改善することを期待しています。 (後者のコードを簡素化した完全な実装ができたら、私はOPになるでしょう) – DBinJP

+0

「より単純で柔軟な」コードを試してみると、「実行時エラー424:オブジェクトが必要です」というエラーが表示されます。 DataRangeが 'with'を使って別のワークシート用に定義されていて、別の 'with'(つまり 'with'で別のシートを指定している)内で使用されたときに何らかの形でこの接続が失われたのかどうか疑問です。しかし、sheetname.DataRangeというシートを指定すると、 'メソッドまたはデータメンバーが見つかりません'と表示されます。 – DBinJP

+0

はい、私はそれをうんざりしました。「DataRange」は配列であり、範囲ではありませんでした。上記の編集を参照してください。 –

関連する問題