Excel VBA删除一行中的特定列
我正在excel中搜索一行中的名称。我想删除该名称之前的所有列,直到指定列 例如,我的名字在第10列,我想删除第2列到第9列的所有内容,这样,带有我名字的第10列将位于第2列的位置Excel VBA删除一行中的特定列,excel,vba,Excel,Vba,我正在excel中搜索一行中的名称。我想删除该名称之前的所有列,直到指定列 例如,我的名字在第10列,我想删除第2列到第9列的所有内容,这样,带有我名字的第10列将位于第2列的位置 Sub delete_cells() Dim rg As Range Set rg = ActiveSheet.Rows(2).Find(What:="Name", LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRo
Sub delete_cells()
Dim rg As Range
Set rg = ActiveSheet.Rows(2).Find(What:="Name", LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, MatchCase:=False)
If Not rg Is Nothing Then
If rg.Column > 1 Then ActiveSheet.Columns("4:" & rg.Column - 3).Delete
Else
MsgBox "Something
End If
End Sub
我得到一个运行时错误。为什么?
编辑说明:
我需要在第2行中搜索“Name”,并将所有值从列I、J、K等移到列E。因此,我需要删除列E到H,并仅为给定行移动列I、J等。不应删除其他行的任何列。可以删除
列的参数
- 列字母,表示列:
Columns(“B”)
- 表示列号的数字:
列(2)
- 两列字母,用冒号分隔,表示从列和到列
列(“B:AA”)
但是,无法传递两个用冒号分隔的数字:列(“2:4”)
无效
我认为最简单的方法是使用调整大小
-方法:
Sub delete_cells(findName As String)
const firstColToDelete = 2 ' (you have 4 in your code, change as you need)
Dim rg As Range
Set rg = ActiveSheet.Rows(2).Find(what:=findName, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
If Not rg Is Nothing Then
Dim colsToDelete As Range
Set colsToDelete = ActiveSheet.Columns(firstColToDelete).Resize(, rg.Column - firstColToDelete)
colsToDelete.Delete
Else
MsgBox "Something"
End If
End Sub
更新:要仅删除标题行(第2行)中的列,请将代码更改为
Dim colsToDelete As Range
Set colsToDelete = ActiveSheet.Cells(2, firstColToDelete).Resize(, rg.Column - firstColToDelete)
colsToDelete.Delete xlShiftToLeft
请注意,这将使最右边的数据列没有标题。这就是您的意图吗?列的参数可以是
- 列字母,表示列:
Columns(“B”)
- 表示列号的数字:
列(2)
- 两列字母,用冒号分隔,表示从列和到列
列(“B:AA”)
但是,无法传递两个用冒号分隔的数字:列(“2:4”)
无效
我认为最简单的方法是使用调整大小
-方法:
Sub delete_cells(findName As String)
const firstColToDelete = 2 ' (you have 4 in your code, change as you need)
Dim rg As Range
Set rg = ActiveSheet.Rows(2).Find(what:=findName, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
If Not rg Is Nothing Then
Dim colsToDelete As Range
Set colsToDelete = ActiveSheet.Columns(firstColToDelete).Resize(, rg.Column - firstColToDelete)
colsToDelete.Delete
Else
MsgBox "Something"
End If
End Sub
更新:要仅删除标题行(第2行)中的列,请将代码更改为
Dim colsToDelete As Range
Set colsToDelete = ActiveSheet.Cells(2, firstColToDelete).Resize(, rg.Column - firstColToDelete)
colsToDelete.Delete xlShiftToLeft
请注意,这将使最右边的数据列没有标题。这就是您的意图吗?在删除列之前
- 在开发用于删除行或列的代码时,最好使用
Select
而不是Delete
,并且只有在代码完成后,才切换到Delete
Resize
和Offset
将准确定义搜索范围
LookIn
参数xlFormulas
将允许在隐藏列中查找匹配项
参数之后的参数,.Cells(.Cells.Count)
(定义最后一个单元格)将使搜索从范围的第一个单元格开始
代码
Option Explicit
Sub deleteColumns()
Const cRow As Long = 2
Const cCol As Long = 2
Const Criteria As String = "Name"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim fCell As Range
With ws.Rows(cRow)
Set fCell = .Resize(, .Columns.Count - cCol).Offset(, cCol) _
.Find(Criteria, .Cells(.Cells.Count), xlFormulas, xlWhole)
End With
If Not fCell Is Nothing Then
ws.Columns(cCol).Resize(, fCell.Column - cCol).Select ' .Delete
Else
MsgBox "Could not find '" & Criteria & "'.", vbExclamation, "Not Found"
End If
End Sub
编辑:
Sub deleteColumns()
Const cRow As Long = 2
Const cCol As Long = 4
Const Criteria As String = "Name"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim fCell As Range
With ws.Rows(cRow)
Set fCell = .Resize(, .Columns.Count - cCol).Offset(, cCol) _
.Find(Criteria, .Cells(.Cells.Count), xlFormulas, xlWhole)
If Not fCell Is Nothing Then
.Columns(cCol).Resize(, fCell.Column - cCol).Delete xlToLeft
Else
MsgBox "Could not find '" & Criteria & "'.", _
vbExclamation, "Not Found"
End If
End With
End Sub
您可以将cRow放在arguments部分:
Sub deleteColumns(ByVal cRow As Long)
并删除行Const cRow,只要长=2
然后,您可以在另一个过程的循环中使用deleteColumns(i)
。在之前删除列
- 在开发用于删除行或列的代码时,最好使用
Select
而不是Delete
,并且只有在代码完成后,才切换到Delete
Resize
和Offset
将准确定义搜索范围
LookIn
参数xlFormulas
将允许在隐藏列中查找匹配项
参数之后的参数,.Cells(.Cells.Count)
(定义最后一个单元格)将使搜索从范围的第一个单元格开始
代码
Option Explicit
Sub deleteColumns()
Const cRow As Long = 2
Const cCol As Long = 2
Const Criteria As String = "Name"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim fCell As Range
With ws.Rows(cRow)
Set fCell = .Resize(, .Columns.Count - cCol).Offset(, cCol) _
.Find(Criteria, .Cells(.Cells.Count), xlFormulas, xlWhole)
End With
If Not fCell Is Nothing Then
ws.Columns(cCol).Resize(, fCell.Column - cCol).Select ' .Delete
Else
MsgBox "Could not find '" & Criteria & "'.", vbExclamation, "Not Found"
End If
End Sub
编辑:
Sub deleteColumns()
Const cRow As Long = 2
Const cCol As Long = 4
Const Criteria As String = "Name"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim fCell As Range
With ws.Rows(cRow)
Set fCell = .Resize(, .Columns.Count - cCol).Offset(, cCol) _
.Find(Criteria, .Cells(.Cells.Count), xlFormulas, xlWhole)
If Not fCell Is Nothing Then
.Columns(cCol).Resize(, fCell.Column - cCol).Delete xlToLeft
Else
MsgBox "Could not find '" & Criteria & "'.", _
vbExclamation, "Not Found"
End If
End With
End Sub
您可以将cRow放在arguments部分:
Sub deleteColumns(ByVal cRow As Long)
并删除行Const cRow,只要长=2
然后可以在另一个过程的循环中使用deleteColumns(i)
。rg.column是355。我在执行代码和ActiveSheet.Columns(“4:&rg.Column-3”)时出错。删除。它给出了一个应用程序或对象定义的错误。这只是一个例子。我需要删除rg.Column-3的第4列。所以所有在4和355之间的列(包括4和355)。rg.column是355应该是什么。我在执行代码和ActiveSheet.Columns(“4:&rg.Column-3”)时出错。删除。它给出了一个应用程序或对象定义的错误。这只是一个例子。我需要删除rg.Column-3的第4列。所以所有在4和355之间的列(包括4和355)。@SJR:是的,你可以。但它将导致第2行:第4行,而不是有效的列,但这并不是我所期望的。我需要做的不仅是删除列,还要把我的名字放在前面,而且只放在第一行,不放在其他行。@Checka不确定我是否理解。你能给你的问题添加一张显示你想要什么的图片吗?我在上面编辑了我的问题。@Checka请看我的update@SJR:是的,你可以。但它将导致第2行:第4行,而不是有效的列,但这并不是我所期望的。我需要做的不仅是删除列,还要把我的名字放在前面,而且只放在第一行,不放在其他行。@Checka不确定我是否理解。你能给你的问题添加一张显示你想要什么的图片吗?我在上面编辑了我的问题。@Checka查看我的更新当我执行宏时,什么也没有发生。它没有删除任何内容要使其适用于您评论中提到的数据,您必须将cCol
设置为4
并将选择
替换为删除
。是的,抱歉。我没有读过。一个问题是,我只需要删除第一行的值。是否可以只对第一行的列修改代码,这样我就可以对每行使用for循环来搜索我的名字,并且只删除特定行的列?我添加了一个新版本。这次会删除,谢谢。我理解您在ano循环中删除列(I)
的意思