Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA删除一行中的特定列_Excel_Vba - Fatal编程技术网

Excel VBA删除一行中的特定列

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

我正在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:=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)
的意思