application.intersect
时间: 2023-07-08 19:32:26 浏览: 150
`application.intersect` 是一个 Excel VBA 方法,用于计算两个或多个范围的交集。它可以用于查找多个范围中共同存在的单元格或区域。这个方法接受两个或多个参数,每个参数都是一个范围对象。例如,可以使用以下代码计算 A1:B5 范围和 C3:D7 范围的交集:
```
Dim intersectRange As Range
Set intersectRange = Application.Intersect(Range("A1:B5"), Range("C3:D7"))
```
如果 A1:B5 范围和 C3:D7 范围有重叠部分,则 `intersectRange` 变量将包含这个交集范围。如果它们没有重叠,则 `intersectRange` 将为 Nothing。
相关问题
Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Set KeyCells = Range("A:A") '要监视的列范围 If Not Application.Intersect(KeyCells, Target) Is Nothing Then '如果目标单元格位于指定列中,请执行以下操作 If WorksheetFunction.CountIf(Range("A:A"), Target.Value) > 1 Then '如果该值已出现在程序运行之前 Dim cel As Range For Each cel In Range("A1:" & Target.Address) '找到本次输入的位置 If cel.Address = Target.Address Then Exit For '如果发现重复的值,则删除本次输入 If cel.Value = Target.Value Then Application.EnableEvents = False '禁用事件处理 Target.ClearContents '删除重复的输入值 Application.EnableEvents = True '启用事件处理 Exit Sub End If Next cel '弹出消息框 MsgBox "该值已存在于单元格 " & Range("A:A").Find(Target.Value).Address & " 中。" '将光标定位到已有值所在的单元格 Range("A:A").Find(Target.Value).Select End If End If End Sub 这段代码有问题,在已有的值上个单元格输入重复值会提示单不会删除,在已有值的下方输入重复值会删除单不会提示,帮我优化这段代码
以下是优化后的代码,能够解决上面提到的问题:
```
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A:A") '要监视的列范围
If Not Application.Intersect(KeyCells, Target) Is Nothing Then
'如果目标单元格位于指定列中,请执行以下操作
If WorksheetFunction.CountIf(Range("A:A"), Target.Value) > 1 Then
'如果该值已出现在程序运行之前
Dim cel As Range
For Each cel In Range("A1:A" & Target.Row - 1)
'找到本次输入的位置
If cel.Address = Target.Address Then Exit For
'如果发现重复的值,则删除本次输入,弹出消息框,将光标定位到已有值所在的单元格
If cel.Value = Target.Value Then
Application.EnableEvents = False '禁用事件处理
Target.ClearContents '删除重复的输入值
Application.EnableEvents = True '启用事件处理
MsgBox "该值已存在于单元格 " & cel.Address & " 中。"
cel.Select
Exit Sub
End If
Next cel
'如果没有重复的值,弹出消息框,将光标定位到已有值所在的单元格
MsgBox "该值已存在于单元格 " & Range("A:A").Find(Target.Value).Address & " 中。"
Range("A:A").Find(Target.Value).Select
End If
End If
End Sub
```
主要修改如下:
1. 在 `For Each cel In Range("A1:A" & Target.Row - 1)` 中,限制循环范围只到本次输入的上方单元格,这样可以避免删除已有值的问题。
2. 在 `If cel.Value = Target.Value Then` 中,添加弹出消息框和光标定位的代码,以便提示用户和方便用户操作。
3. 在 `If WorksheetFunction.CountIf(Range("A:A"), Target.Value) > 1 Then` 的条件判断中,如果没有重复的值,也需要弹出消息框和将光标定位到已有值所在的单元格。
Sub 选中列单元格内容拆分为多行_单列版() '对选中区域的单元格,内容按指定分隔符拆分,适用整列选中、单列部分选中、单个单元格选中 Dim rng As Range, delimiter As String, first_row, last_row, first_col, i, j, arr delimiter = ".[" '分隔符,有,[和)[两种,具体见说明书 Set rng = Intersect(ActiveSheet.UsedRange, Selection) 'intersect语句避免选择整列造成无用计算 If rng.Columns.Count > 1 Then Debug.Print "仅支持单列": Exit Sub '仅支持单列,多列则退出 first_row = rng.Row '选中区域开始行号 last_row = first_row + rng.Rows.Count - 1 '选中区域结束行号 first_col = rng.Column '选中区域开始列号 Application.ScreenUpdating = False '关闭屏幕更新,加快程序运行 Application.DisplayAlerts = False '不显示警告信息 For i = last_row To first_row Step -1 '倒序循环 If InStr(Cells(i, first_col).Value, delimiter) > 0 Then arr = Split(Cells(i, first_col).Value, delimiter) For j = 0 To UBound(arr) - 1 '在当前行后插入、复制本行(插入arr-1行) Rows(i + 1).Insert Rows(i).Copy Range("A" & i + 1) Next Cells(i, first_col).Resize(UBound(arr) + 1) = WorksheetFunction.Transpose(arr) End If Next Columns(first_col).AutoFit '列宽自适应 Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
这段代码是一个VBA宏,用于将选中的单列单元格内容按指定的分隔符拆分为多行。具体步骤如下:
1. 设置分隔符:将变量delimiter赋值为指定的分隔符,可以是".["或")["
2. 获取选中区域:使用Intersect函数获取当前活动工作表中被选中的区域,并将其赋值给变量rng
3. 判断是否为单列:通过判断rng.Columns.Count的值是否大于1,如果大于1则表示选中了多列,程序将输出提示信息并退出
4. 获取选中区域的行号和列号:将选中区域的起始行号、结束行号和起始列号分别赋值给变量first_row、last_row和first_col
5. 关闭屏幕更新和警告信息:将Application.ScreenUpdating和Application.DisplayAlerts的值分别设置为False,用于提高程序运行效率并避免弹出警告信息
6. 倒序循环处理每一行:从结束行开始循环到起始行,逐行进行处理
7. 判断是否需要拆分:使用InStr函数判断当前行第一个单元格的值是否包含分隔符,如果包含则需要进行拆分操作
8. 拆分并插入新行:使用Split函数按照分隔符将当前单元格的值拆分为数组arr,然后使用循环将当前行后插入arr-1行,并将当前行的内容复制到插入的行中
9. 更新拆分后的值:将拆分后的数组arr通过WorksheetFunction.Transpose函数转置后,赋值给当前行的单元格范围
10. 自适应列宽:使用Columns(first_col).AutoFit语句来自适应调整第一列的列宽
11. 恢复屏幕更新和警告信息:将Application.ScreenUpdating和Application.DisplayAlerts的值分别设置为True,以恢复原始设置。
注意:这段代码只适用于单列选中的情况,并且分隔符只能是".["或")[",如果选中了多列或使用了其他分隔符,程序会输出相应的提示信息并退出。
阅读全文