2011-03-18 86 views
1

我有一個宏,因此當您在sheet1上突出顯示一行時,宏將從此行獲取所有信息並在sheet2上自行顯示此信息。如果突出顯示sheet1上的不同行,sheet2上的信息將發生變化以顯示該行中的信息。如何編輯Excel中通過宏代碼顯示的單元格中的信息?

我的問題是,如果我更改sheet2上顯示的信息,它不會更改sheet1上的信息。有沒有一種方法可以添加此功能?

我此刻的下面的代碼:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim myList 
If Target.Address <> Target.EntireRow.Address Then Exit Sub 
If Target.Rows.Count > 1 Then Exit Sub 
myList = [{"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15"}] '<- adjust to your need 
With Target.EntireRow 
    For i = 1 To UBound(myList) 
     Sheets("sheet2").Range(myList(i)).Value = .Cells(i).Value 
    Next 
End With 
End Sub 

任何幫助將真棒! :)

+0

我不確定你的sheet2的功能 - 是不是可以使用你的宏在sheet1上運行自動過濾器? – 2011-03-18 13:12:07

+1

Sheet2僅僅是爲了讓您能夠清楚地查看sheet1上某一行的所有內容,而無需一直滾動到sheet1的右側。因此,當我突出顯示sheet1上的一行時,我可以更改爲sheet2並以垂直佈局清晰地查看該行中的信息。不確定是否有更好的方法來做到這一點?我在這方面有點新手! :) – ade123 2011-03-18 13:18:31

+0

此代碼僅適用於選擇整行的情況。如果您更改單個單元格的值,則如果Target.Address <> Target.EntireRow.Address Then Exit Sub'行將退出該過程而不運行剩餘的代碼。 – 2012-07-04 16:47:20

回答

0

將sheet1行復制到sheet2之後,還可以記錄這些值來自的原始行#。然後,您可以添加一個額外的宏,將sheet2值與sheet1中的值進行比較 - 然後可以遷移任何更改。

一個可能的基本流程:

  • 複製工作表Sheet1行到Sheet2(當前宏)
  • 複製工作表Sheet1列#到Sheet2(即一行向下)
  • 使在Sheet2上
  • 副本的修改sheet2行到sheet1行(使用sheet2上保存的行號) - >這裏假設不會對sheet1進行任何更改。
+0

oooohhh ...聽起來有點複雜! :o(我在Excel中並不是那麼棒,特別是在編寫宏時。 – ade123 2011-03-18 13:20:07

+0

@ ade123 - 在我的回答中增加了一些註釋。 – 2011-03-18 13:25:21

0

您正在使用Worksheet_SelectionChange事件宏已經超出了一個完整的單排承認。對於Sheet2,您需要一個Worksheet_Change事件宏來識別B1:B15範圍內的值何時發生更改並將更改傳遞迴Sheet1。

因爲Worksheet_Change觸發對值的變化,你需要禁用Application.EnableEvents property使其觸發當你從工作表Sheet1的Worksheet_SelectionChange子寫的值。

你將需要一些公共變量。要記住更改的位置應該返回到另一個位置,以便在Sheet2上定位目標單元格。這些只能在模塊代碼表中公開。

第一冊 - 模塊1(代碼)

Option Explicit 

Public Const sRNG As String = "B1:B15" 
Public rRNG As Range 

我做了幾個小的修改原來的Worksheet_SelectionChange並添加事件的處理禁用。

第一冊 - 工作表Sheet1(代碼)

Option Explicit 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Target.Cells.Count = Columns.Count And Target.Rows.Count = 1 And _ 
     CBool(Application.CountA(Target)) Then '<~~ one complete non-blank row 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     With Sheet2.Range(sRNG) 
      Set rRNG = Target.Cells(1, 1).Resize(.Columns.Count, .Rows.Count) 
      .Cells = Application.Transpose(rRNG.Value) 
     End With 
    End If 

bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

工作表.CodeName property被用來確定Sheet2中,因爲如果工作表通常改名這不會改變。

對於您計劃如何確定要將值返回給其更改後的行,有點不清楚。我使用了在Module1中聲明的公共範圍類型的變量來記錄值從Sheet1傳遞到Sheet2的最後一個位置。Sheet2上的更改將把它們返回到最後記錄的位置。

第一冊 - Sheet2中(代碼)

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range(sRNG)) Is Nothing Then 
     Debug.Print rRNG.Address(0, 0, external:=True) 
     On Error GoTo bm_Safe_Exit 
     Application.EnableEvents = False 
     rRNG = Application.Transpose(Range(sRNG).Value) 
    End If 

bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

注意 '記得' 的位置是在只讀存儲器。關閉並重新打開工作手冊有效地「清零」它。除非您有新加載的來自Sheet1的值,否則不要在Sheet2上進行更改。

相關問題