如何从范围

时间:2016-08-30 09:29:16

标签: excel vba excel-vba macros

我是VBA的新用户,我正在尝试删除从.csv文件加载的不需要的列。我正在导入大量数据,但后来我问用户他们想要继续使用哪些列" ID号。"。有很多列具有不同的ID号。我想问用户他们想要保留什么并删除其余的。

问题是我需要删除用户不想要的所有其他列,但我仍然需要保留前6列和最后两列,因为这是不同的信息。

这是我到目前为止所做的:

Sub Select()
'the below will take the users inputs
UserValue = InputBox("Give the ID no. to keep seperating with a comma e.g"12,13,14")
'the below will pass the user inputs to the example to split the values
Call Example(UserValue)
End Sub

Sub Example(UserValue)


TestColArray() = Split(UserValue, ",")
 For Each TestCol In TestColArray()
' keep all the columns user wants the delete the rest except the first 6 columns and last 2
Next TestCol

End Sub

这就是我到目前为止,它并不多,但用户可以在输入框中放入许多具有不同ID号的列,就像Excel工作表的布局一样,所有ID都在行中由于ID号为2,因此第2行和前2列是第2行的空白。不适用。我希望有所帮助。

2 个答案:

答案 0 :(得分:1)

试试这个(注释)代码:

Option Explicit '<--| use this statament: at the cost of having to declare all used variable, your code will be much easier to debug and maintainable

Sub MySelect()
    Dim UserValue As String

    'the below will take the users inputs
    UserValue = Application.InputBox("Give the ID no. to keep seperating with a comma e.g: ""12,13,14""", Type:=2) '<--| use Type:=2 to force a string input

    'the below will pass the user inputs to the example to split the values
    Example UserValue '<--| syntax 'Call Example(UserValue)' is old
End Sub

Sub Example(UserValue As String)
    Dim TestCol As Variant
    Dim cellsToKeep As String
    Dim firstIDRng As Range, lastIDRng As Range, IDRng As Range, f As Range

    Set firstIDRng = Range("A2").End(xlToRight) '<-- first ID cell
    Set lastIDRng = Cells(2, Columns.Count).End(xlToLeft) '<-- last ID cell
    Set IDRng = Range(firstIDRng, lastIDRng) '<--| IDs range
    cellsToKeep = firstIDRng.Offset(, -6).Resize(, 6).Address(False, False) & "," '<--| initialize cells-to-keep addresses list with the first six  blank cells at the left of first ID
    For Each TestCol In Split(Replace(UserValue, " ", ""), ",") '<--| loop through passed ID's
        Set f = IDRng.Find(what:=TestCol, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) '<--| search for the current passed IDs range
        If Not f Is Nothing Then cellsToKeep = cellsToKeep & f.Address(False, False) & ","  '<--| if the current ID is found then update cells-to-keep addresses list
    Next TestCol
    cellsToKeep = cellsToKeep & lastIDRng.Offset(, 1).Resize(, 2).Address(False, False) '<--| finish cells-to-keep addresses list with the firts two blank cells at the right of last ID

    Range(cellsToKeep).EntireColumn.Hidden = True '<-- hide columns-to-keep
    ActiveSheet.UsedRange.EntireColumn.SpecialCells(xlCellTypeVisible).EntireColumn.Delete '<--| delete only visible rows
    ActiveSheet.UsedRange.EntireColumn.Hidden = False '<-- unhide columns
End Sub

假设它正在使用当前活动的工作表

答案 1 :(得分:-2)

简单的Google搜索会生成this。在结果的第一页也是如此。也许这将满足您的需求。

如果需要删除的数据集非常大(大于你想要保留的范围。)那么在导入csv时可能只选择你想拥有的列?此stackoverflow question显示了如何导入特定列。

修改 因此,从我认为OP作为问题说明,有一个大的csv文件被导入到excel中。导入后,有很多应该删除的冗余列。我的第一个想法是首先只导入所需的数据(列)。通过使用带有.TextToColumns参数的FieldInfo方法,可以通过VBA实现这一点。如上所述,上面链接的stackoverflow问题提供了这样做的方法。

如果选择性导入不是一个选项,并且您仍然热衷于进行用户选择的反转。一个选项是创建2个范围(一个是用户选择的范围,第二个是整个工作表),您可以在两个范围之间执行交叉检查,如果没有交叉存在则删除范围(即删除任何单元格)这不是用户选择的一部分)。这个方法由我提供的第一个链接提供,非常简单。