2017-07-08 19 views
0

VBA transfer data from one sheet to anotherVBAは添付画像に

別のブックにデータを転送し、これが最終目標です。

VBAを使用して、あるシートから別のシートにデータを転送したいとします。 "Submit"をクリックすると、Country、Name、Surnameのデータが「data」という名前のシートに正しく送信されます。しかし、「データ」という名前のシートに「レース」フィールドを挿入する方法が不明です。私はif文を使うべきだと理解していますが、VBAコードに組み込む方法がわかりません。

これは現時点でのVBAコードです。

Private Sub CommandButton1_Click() 

    Dim Country As String, Name As String, Surname As String, Race As String 
    Worksheets("form").Select 

    Country = Range("B4") 
    Name = Range("B6") 
    Surname = Range("B7") 
    Race = Range("B13") 

    Worksheets("data").Select 
    Worksheets("data").Range("A1").Select 
    If Worksheets("data").Range("A1").Offset(1, 0) <> "" Then 
      Worksheets("data").Range("A1").End(xlDown).Select 
    End If 

    ActiveCell.Offset(1, 0).Select 
    ActiveCell.Value = Country 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Name 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Surname 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.Value = Race 

    Worksheets("form").Select 
    Worksheets("form").Range("A4").Select 
End Sub 

私はVBAを初めてお使いになりましたが、この件に関するお手伝いをさせていただきます。ここで

答えて

3

は/有効化/コピー/貼り付け]を選択)しかし、私はあなた

1のためのいくつかの批判を持っている、あなたのための何か、すべての悪い習慣です。無駄なコードをたくさん書いてしまって、それを使い果たしてしまい、全体のペルコスを遅くすることになります。あなたが関わっているものがたくさんある場合、このことは重要です。

2)。フォームタブのレースは、マージされたセルのように見えます。私のコードスニペットは、レースが実際にはセルb13、c13、d13であるという前提の下で動作しています。結合されたセルは煩わしく、問題の原因となっている可能性があります。または私は完全に間違っている可能性があり、あなたは本当に新しいスーパーです。いずれにしても、あなたは何かを学びます。

Private Sub CommandButton1_Click() 
    Dim Country As String, Name As String, Surname As String, Race As String 
    dim ws as worksheet, wb as workbook, ws1 as worksheet 

    set wb = ThisWorkbook 
    set ws = wb.Sheets("form") 
    set ws1 = wb.Sheets("data") 
    Country = ws.Range("B4").value 
    Name = ws.Range("B6").value 
    Surname = ws.Range("B7").value 

    If ws.Range("B13").Value <> "" Then Race = "White" 
    If ws.Range("C13").Value <> "" Then Race = "Black" 
    If ws.Range("D13").Value <> "" Then Race = "Asian" 

    ws1.Cells(ws1.Rows.Count,1).End(xlUp).Offset(1,0).Value = Country 
    ws1.Cells(ws1.Rows.Count,1).End(xlUp).Offset(0,1).Value = Name 
    ws1.Cells(ws1.Rows.Count,1).End(xlUp).Offset(0,2).Value = Surname 
    ws1.Cells(ws1.Rows.Count,1).End(xlUp).Offset(0,3).Value = Race 
End Sub 

私は実際には、これほど良く、少ない変数のようなものです。無意味な変数を使用して値を格納するのではなく、値を配列に格納して一気に移動することができます。オーバーヘッドを節約することもできます。 許可私はシート/ワークブックのオブジェクトを作るために同じ量の変数を使用しましたが、あなたはそれらを長い道のりで書くことができます(私は実際にその点でそのテキストのブランケットであってもそうします)。

複数のレースが選択された場合に備えていくつかのチェックが含まれています。

Private Sub here() 

    Dim ws As Worksheet, wb As Workbook, ws1 As Worksheet 
    Dim arr(0, 4) As String 

    Set wb = ThisWorkbook 
    Set ws = wb.Sheets("Sheet1") 
    Set ws1 = wb.Sheets("Sheet2") 
    arr(0, 0) = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Value + 1 
    arr(0, 1) = ws.Range("B4").Value 
    arr(0, 2) = ws.Range("B6").Value 
    arr(0, 3) = ws.Range("B7").Value 

    If (ws.Range("B13").Value <> "" And ws.Range("C13").Value <> "") _ 
     Or (ws.Range("B13").Value <> "" And ws.Range("D13").Value <> "") _ 
      Or (ws.Range("D13").Value <> "" And ws.Range("C13").Value <> "") Then 
     arr(0, 4) = "Mixed Race" 
    Else 
     arr(0, 4) = IIf(ws.Range("B13").Value <> "", "White", _ 
      IIf(ws.Range("C13").Value <> "", "Black", _ 
       IIf(ws.Range("D13").Value <> "", "Asian", "Must Be Non-Human"))) 
    End If 

    ws1.Range(ws1.Cells(ws1.UsedRange.Rows.Count + 1, 1), _ 
     ws1.Cells(ws1.UsedRange.Rows.Count + 1, 5)).Value2 = arr 

End Sub 
+1

これは私が探していたものです。あなたの批判に感謝し、それから学びます。心から感謝する。 – ALK

+0

問題を解決するための別のアプローチを私に提供してくれてありがとう。 もう一度質問してください。セル "A1"に余分な列フィールドを提供したい場合。このフィールドには、シート「データ」に入力された新しいエントリごとのインデックス番号が表示されます。それについてどうすればいいのですか? – ALK

+0

@ALK簡単に;)楽しむ –

関連する問題