2011-12-27 33 views
1

我想嘗試幾天以來,但由於缺乏VBA技能,所以無法正常工作。更改單元格後,用VBA對應一個鍵的Excel複製值

場景:

  1. 用戶:選擇從下拉列表中的值(細胞只允許在另一個表中定義的列表 )。
  2. 代碼:將剩餘的值複製到適當的列表值。 (這是一個名稱列表。)
  3. 代碼:將值粘貼到表單中的特定字段中。

實施例:
用戶從下拉列表採摘值「團隊一」在A1在片之一。該表在第二張表中定義。在表二的列表中的每個項目旁邊都有一個用逗號分隔的名稱列表。 用戶從下拉列表中選擇一個團隊後,相應的名稱列表將被複制到表1中的字段B1中。

此過程只能在A1更改時觸發。

希望我能說清楚。如果我自己終於找到解決方案,我會在這裏發佈。

感謝您閱讀本文。

+0

簽名被刪除,請參見常見問題解答。 – 2011-12-28 04:09:41

+0

我需要在VBA中這樣做,因爲要粘貼值的單元格不應該包含任何公式,因爲單元格大部分時間都會被用戶覆蓋。 – Stowoda 2012-01-02 15:08:33

回答

0

要做到這一點作爲VBA,你會做類似下面的事情。根據您的原始問題,Sheet2上有一個列表,對應於下拉框中的選擇並填充到Sheet1上。

在VBA編輯:

  1. Sheet 1中添加下列方法

    Private Sub ComboBox1_Change() 
    
    If ComboBox1.Text <> "Select" Then 
    
        Dim selVal As String 
    
        selVal = ComboBox1.Text 
    
        Range("B1").Value = GetList(selVal) 
    
    End If 
    
    End Sub 
    
    Public Function GetList(ByVal Value As String) As Variant 
    
    Dim result As Variant 
    
    result = Application.VLookup(Value, Worksheets("Sheet2").Range("A1:B100"), 2, False) 
    
    GetList = result 
    
    End Function 
    
  2. 在工作簿對象代碼,輸入以下方法:

    Private Sub Workbook_Open() 
    
    With ThisWorkbook.Worksheets("Sheet1").ComboBox1 
         .AddItem "Team One" 
         .AddItem "Team Two" 
         .AddItem "Team Three" 
         .AddItem "Team Four" 
         .AddItem "Team Five" 
         .Text = IIf(.Text = "", "Select", .Text) 
        End With 
        Worksheets("Sheet1").Activate 
    End Sub 
    

我應該注意到您可以通過簡單地使用Excel中數據驗證選項中的列表控件來完成此操作。當你做出選擇改變時,你會使用單元格B1中的標準VLookup來獲取相應的值。

3

您可以在不使用VBA的情況下執行此操作。在現場你想粘貼到輸入公式名稱列表:

=IF(ISBLANK(<address of dropdown on Sheet1>),"",INDEX(<address of list to left of values on Sheet2>,MATCH(<address of dropdown on Sheet1>,<address of dropdown values on Sheet2>,0))) 

時,從下拉列表中選擇任何內容,並且在選擇的值將顯示名稱的相應列表這將是空白。

例如,如果在下拉是在Sheet 1上B1,下拉值在B1:B9 Sheet 2上,和名稱的對應的列表是在A1:Sheet 2上A9,將使用以下公式:

=IF(ISBLANK(Sheet1!B1),"",INDEX(Sheet2!A1:A9,MATCH(Sheet1!B1,Sheet2!B1:B9,0))) 

編輯(每條評論): 要在VBA中使用它,您需要執行類似於@chris neilsen建議的操作。在工作表中,您將需要創建一個子一變事件:

Option Explicit 
Private Sub Worksheet_Change(ByVal Target As Range) 
If Not Intersect(Target, Range("B1")) Is Nothing Then 
    Range("A1").Formula = "=INDEX(Sheet2!A1:A9,MATCH(Sheet1!B1,Sheet2!B1:B9,0))" 
    If IsError(Range("A1").Value) Then 
     Range("A1") = "" 
    Else 
     Range("A1").Value = Range("A1") 
    End If 
End If 
End Sub 

爲了消除任何混亂,A1是將顯示輸出單元。

+0

明確而簡單:) – JMax 2011-12-28 07:42:38

+0

謝謝你的回答。不幸的是,我沒有解釋,用戶可以改變單元格,從而覆蓋公式。 – Stowoda 2012-01-02 15:10:52

0

我會提倡一種類似於Excell所述的方法,但使用VLOOKUP而不是MATCH。要做到這一點,你需要在每個團隊的名字右邊列出你的名字。例如:現在

| A |  B 
1 |Team 1 |Albert, Beth 
2 |Team 2 |Carlo, Delia 
3 |Team 3 |Egbert, Frederika 

,如果球隊的名稱是在單元格B7,你可以用這個公式來獲取名稱的關聯列表:下面 見道格Glancy的評論

=VLOOKUP(B7, Sheet2!$A$1:$B$3, 2, FALSE) 

編輯解釋了爲什麼Excellll的解決方案比使用VLOOKUP更好。

+2

爲什麼你提倡VLookup超過索引/匹配? VLookup將您需要查看的數據的約束添加到右側,而Index/Match沒有。此外VLookup是不穩定的,因此可能會更慢。我主張使用索引/匹配。 – 2011-12-27 21:06:34

+0

@DougGlancy你說服了我。 – phoog 2011-12-27 21:58:16

0

要在VBA中執行此操作,請使用Change事件來監視數據輸入單元。

假設你有一個名爲您的驗證數據範圍內ListData,就把自己的模塊中Sheet1

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$A$1" Then 
     [B1] = Application.WorksheetFunction.VLookup(Target.Value, [ListData].Resize(, 2), 2, 0) 
    End If 
End Sub 
相關問題