2017-03-08 13 views
0

ExcelワークシートとVBAを使用してセルの情報を完成し、更新しています。Excel VBA:以前のセルの変更に基づいてセルを更新します。

Excelテーブルには7つの列があります。そのうち3つはデータ検証付きのドロップダウンリストです。このリストでは、次のVBAコードを使用してそのデータを入力します。

Private Sub TempCombo_KeyDown(ByVal _KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) 

    'Ocultar caixa de combinação e mover a próxima célula com Enter e Tab 

    Select Case KeyCode 
     Case 9 
      ActiveCell.Offset(0, 1).Activate 
     Case 13 
      ActiveCell.Offset(1, 0).Activate 
     Case Else 
      'Nada 
    End Select 

End Sub 

これらの列は、以下のコードを使用して、オートコンプリートで動作:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    Dim str As String 
    Dim cboTemp As OLEObject 
    Dim ws As Worksheet 
    Dim wsList As Worksheet 

    Set ws = ActiveSheet 
    Set wsList = Sheets(Me.Name) 

    Application.EnableEvents = False 
    Application.ScreenUpdating = False 

    If Application.CutCopyMode Then 
     'Permite copiar e colar na planilha 
     GoTo errHandler 
    End If 

    Set cboTemp = ws.OLEObjects("TempCombo") 

    On Error Resume Next 

    With cboTemp 
     .Top = 10 
     .Left = 10 
     .Width = 0 
     .ListFillRange = "" 
     .LinkedCell = "" 
     .Visible = False 
     .Value = "" 
    End With 

    On Error GoTo errHandler 

     If Target.Validation.Type = 3 Then 
      Application.EnableEvents = False 
      str = Target.Validation.Formula1 
      str = Right(str, Len(str) - 1) 
      With cboTemp 
       .Visible = True 
       .Left = Target.Left 
       .Top = Target.Top 
       .Width = Target.Width + 15 
       .Height = Target.Height + 5 
       .ListFillRange = str 
       .LinkedCell = Target.Address 
     End With 
     cboTemp.Activate 
     'Abrir a lista suspensa automaticamente 
     Me.TempCombo.DropDown 
    End If 

    errHandler: 
     Application.ScreenUpdating = True 
     Application.EnableEvents = True 
    Exit Sub 

End Sub 

I行上の任意のセルを更新いつでも、私は、この行の第7列のコンテンツを用いて更新されることを望ん現在の日付。

私は次のコードを使ってみましたが、一般的なセル、つまり手動でコンテンツを入力したセルでのみ動作します。ドロップダウンリストの選択を変更すると、7番目の列が更新されます。

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Target.Row = 1 Then Exit Sub 
     Application.EnableEvents = False 
     Cells(Target.Row, "U").Value = Date 

End Sub 

以前に述べたように列の内容を更新する方法はありますか?ドロップダウンリストで選択したオプションを変更した場合でも、

+0

あなたの最初のサブで、なぜ細胞を活性化していますか?それらで何かしたいですか?あるいは、あなたは 'Worksheet_SelectionChange'をトリガーするためにそれをやっていますか? – BruceWayne

+0

@BruceWayneが 'Worksheet_SelectionChange'をトリガーします。 – cfrancklin

+1

データ検証、リストを使用してドロップダウンを生成する場合は、それらをWorksheet_Changeによってトリガーする必要があります。他のコードは必要なく、問題を混乱させる可能性があります。 Worksheet_Changeイベントサブを終了する前に、EnableEventsをオンに戻すことを忘れないでください。 – Jeeped

答えて

1

あなたのコードはになる必要があること以外は問題ありません。にイベントを戻してください。この行で発砲したイベントは停止しました:Application.EnableEvents = Falseただし、イベントの再開を再びオンにすることはありません。したがって、初めてセルを変更したときにコードが機能するため、Worksheet_Changeイベントは予期したとおりに発生します。ただし、このサブ内では、EnableEventsをfalseに設定してから、trueに戻すことはありません。だから、あなたはこれを含む将来のすべての出来事を、将来再開するのをやめました。ここに解決策があります:

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Target.Row = 1 Then Exit Sub 
     Application.EnableEvents = False 
     Cells(Target.Row, "U").Value = Date 
     Application.EnableEvents = True 

End Sub 
関連する問題