Vba 工作表\u更改宏-更改多个单元格

Vba 工作表\u更改宏-更改多个单元格,vba,excel,Vba,Excel,我写了一个宏,虽然它可以工作,但在功能上它并不是所需要的。这是一个交互式检查表,可以分解机器的多个区域,如果机器正在工作,则检查它们,然后用多个部分更新主列表。但是,它一次只能处理一个单元格,并且需要能够同时处理多个单元格(行和列)。以下是我当前的代码: 'Updates needed: ' Make so more than one cell works at a time ' in both x and y directions Private Sub Worksh

我写了一个宏,虽然它可以工作,但在功能上它并不是所需要的。这是一个交互式检查表,可以分解机器的多个区域,如果机器正在工作,则检查它们,然后用多个部分更新主列表。但是,它一次只能处理一个单元格,并且需要能够同时处理多个单元格(行和列)。以下是我当前的代码:

'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方向
私有子工作表_变更(ByVal目标为Excel.range)
将wb设置为工作簿
Dim mWS作为工作表
暗号为字符串
Dim mCol As范围
作为整数的Dim mCon
不算长
暗淡单元格作为范围
朦胧如弦
计数=1
y=“”
设置wb=ActiveWorkbook
设置mWS=wb.Sheets(“主控”)
设置mCol=mWS.范围(“B:B”)
mCon=0
'选择我们需要在主列表中搜索的字符串值的名称
如果Target.Column<100,则
ThisRow=Target.Row
conName=ActiveSheet.Cells(此行“B”)
y=目标值
如果结束
'在主列表中搜索匹配的字符串值
对于mCol中的每个单元格
如果cell.Value=conName,则
mCon=计数
退出
如果结束
计数=计数+1
下一个
'在主列表中标记为“x”
Dim cVal作为变体
设置cVal=mWS.单元格(计数、目标列)
cVal.值=y
端接头

发生的情况-如果我向下拖动多行或多列的“x”,我的代码将在y=Target.Value处中断,并且只会更新我第一次选择的单元格及其在主列表上的对应单元格。它应该做的是,如果我将“x”拖放到多行列上,它应该更新我正在处理的工作表和主列表中的所有列。我一次只为一个单元格设置宏,我不知道如何设置宏,以便为多行拖放“x”值

我想您需要一个
来。。。在
目标上的每次
迭代
,以便使用多个单元格。正如Michael在评论中指出的那样,
\u Change
事件只触发一次,但是
目标
反映了所有已更改的单元格,因此您应该能够在
目标
范围内进行迭代。我使用这个简单的事件处理程序进行了测试:

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
Private子工作表\u更改(ByVal目标为Excel.range)
将wb设置为工作簿
Dim mWS作为工作表
暗号为字符串
Dim mCol As范围
作为整数的Dim mCon
不算长
暗淡单元格作为范围
朦胧如弦
计数=1
y=“”
设置wb=ActiveWorkbook
设置mWS=wb.Sheets(“主控”)
设置mCol=mWS.范围(“B:B”)
mCon=0
'添加一些新变量:
将myRange变暗为Range
暗淡的迈塞尔山脉
设置myRange=Target
Application.EnableEvents=False'##防止无限循环
对于myRange.Cells中的每个菌丝体
如果迈塞尔柱<100,则
ThisRow=myCell.Row
conName=ActiveSheet.Cells(此行“B”)
y=myCell.Value
如果结束
'在主列表中搜索匹配的字符串值
对于mCol中的每个单元格
如果cell.Value=conName,则
mCon=计数
退出
如果结束
计数=计数+1
下一个
'在主列表中标记为“x”
Dim cVal作为变体
设置cVal=mWS.单元格(计数、目标列)
cVal.值=y
下一个
Application.EnableEvents=True'##将事件处理还原为True
端接头

我想你需要一个
来。。。在
目标上的每次
迭代
,以便使用多个单元格。正如Michael在评论中指出的那样,
\u Change
事件只触发一次,但是
目标
反映了所有已更改的单元格,因此您应该能够在
目标
范围内进行迭代。我使用这个简单的事件处理程序进行了测试:

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
Private子工作表\u更改(ByVal目标为Excel.range)
将wb设置为工作簿
Dim mWS作为工作表
暗号为字符串
Dim mCol As范围
作为整数的Dim mCon
不算长
暗淡单元格作为范围
朦胧如弦
计数=1
y=“”
设置wb=ActiveWorkbook
设置mWS=wb.Sheets(“主控”)
设置mCol=mWS.范围(“B:B”)
mCon=0
'添加一些新变量:
将myRange变暗为Range
暗淡的迈塞尔山脉
设置myRange=Target
Application.EnableEvents=False'##防止无限循环
对于myRange.Cells中的每个菌丝体
如果迈塞尔柱<100,则
ThisRow=myCell.Row
conName=ActiveSheet.Cells(此行“B”)
y=myCell.Value
如果结束
'在主列表中搜索匹配的字符串值
对于mCol中的每个单元格
如果cell.Value=conName,则
mCon=计数
退出
如果结束
计数=计数+1
下一个
'在主列表中标记为“x”
Dim cVal作为变体
设置cVal=mWS.单元格(计数、目标列)
cVal.值=y
下一个
Application.EnableEvents=True'##将事件处理还原为True
端接头

您需要使用
ForEach
循环遍历单元格

此外,使用
选择
对象可能比使用
目标

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

您需要使用
ForEach
循环遍历单元格

此外,使用
选择
对象可能比使用
目标

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

你能详细说明一下你的意思吗:它需要能够同时处理多个单元格(包括行和列)??可能包括对预期发生的情况以及正在发生的情况的更好描述。正在发生的情况-如果我向下拖动多行或多列的“x”,我的代码将在y=Target.Value处中断,并且只会更新我第一次选择的单元格及其在主列表上的对应单元格。它应该做的是如果我拖放“