0

私はマクロを書きましたが、それは機能しますが、機能的には必要なものではありません。これは、マシンの複数の領域を分類するインタラクティブなチェックリストであり、それらが機能している場合はそれらをチェックし、複数のセクションでマスター リストを更新します。ただし、一度に 1 つのセルでしか機能せず、一度に複数のセル (行と列の両方) を操作できる必要があります。これが私の現在のコードです:

'Updates needed:
'       Make so more than one cell works at a time
'       in both x and y directions

Private Sub Worksheet_Change(ByVal Target As Excel.range)
    Dim wb As Workbook
    Dim mWS As Worksheet
    Dim conName As String
    Dim mCol As range
    Dim mCon As Integer
    Dim count As Long
    Dim cell As range
    Dim y As String

    count = 1
    y = ""
    Set wb = ActiveWorkbook
    Set mWS = wb.Sheets("Master")
    Set mCol = mWS.range("B:B")
    mCon = 0


   'Selects the name of the string value in which we need to search for in master list
    If Target.Column < 100 Then
       ThisRow = Target.Row
       conName = ActiveSheet.Cells(ThisRow, "B")
       y = Target.Value
    End If 

    'search for matching string value in master list
    For Each cell In mCol
        If cell.Value = conName Then
            mCon = count
                Exit For
        End If
       count = count + 1
    Next
  'mark as "x" in Master list
   Dim cVal As Variant
   Set cVal = mWS.Cells(count, Target.Column)
   cVal.Value = y
End Sub

何が起こっているのか - 複数の行または列に対して "x" をドラッグすると、コードが y = Target.Value で壊れ、最初に選択したセルとマスター リストの対応するセルのみが更新されます。「x」を列の複数の行にドラッグアンドドロップすると、作業中のシートとマスターリストのすべてが更新されます。一度に 1 つのセルに対してのみマクロを設定しましたが、複数の行の「x」値をドラッグ アンド ドロップするようにマクロを設定する方法がわかりません

4

2 に答える 2

3

複数のセルを操作するには、For ... Each繰り返しが必要だと思います。Targetマイケルがコメントで指摘したように、_Changeイベントは一度だけ発生しますが、変更されたすべてのセルが反映されるため、範囲Targetを反復処理できるはずです。Targetこの単純なイベント ハンドラーを使用してテストしました。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Dim myCell As Range
Set myRange = Target

For Each myCell In myRange.Cells
    Debug.Print myCell.Address
Next

End Sub

データ/ワークシートで明らかにテストすることはできませんが、正しい軌道に乗せるべきだと思います.

Private Sub Worksheet_Change(ByVal Target As Excel.range)
Dim wb As Workbook
Dim mWS As Worksheet
Dim conName As String
Dim mCol As range
Dim mCon As Integer
Dim count As Long
Dim cell As range
Dim y As String

count = 1
y = ""
Set wb = ActiveWorkbook
Set mWS = wb.Sheets("Master")
Set mCol = mWS.range("B:B")
mCon = 0

'Add some new variables:
Dim myRange as Range
Dim myCell as Range
Set myRange = Target

Application.EnableEvents = False '## prevents infinite loop
For each myCell in myRange.Cells
    If myCell.Column < 100 Then
       ThisRow = myCell.Row
       conName = ActiveSheet.Cells(ThisRow, "B")
       y = myCell.Value
    End If 

    'search for matching string value in master list
    For Each cell In mCol
        If cell.Value = conName Then
            mCon = count
                Exit For
        End If
       count = count + 1
    Next
  'mark as "x" in Master list
   Dim cVal As Variant
   Set cVal = mWS.Cells(count, Target.Column)
   cVal.Value = y

Next
Application.EnableEvents = True '## restores event handling to True
End Sub
于 2013-10-30T15:32:16.990 に答える
1

ForEachループを使用してセルを反復処理する必要があります。

Selectionまた、よりもオブジェクトを使用する方が良い場合がありますTarget

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


For Each cell In Selection
    Debug.Print cell.Address
Next cell



Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

Exit Sub
于 2013-10-30T15:35:34.913 に答える