0

我有一个不相关的分类问题的数据集,我想这样做,我想减少属性总数。我已经将我的数据集转换为 CSV 格式,excel 处理得很好,但我需要做一些改变——而且我从来没有做过任何 VBA,所以语法对我来说似乎非常陌生。

基本上,我有 7071 列(属性)和 70 行(实例)。每列下方的单元格(例如 A 列的 A75)包含用于属性评估的特定统计方法。我想要做的是检查此单元格中的值(在此示例中为“A75”),如果它低于某个阈值,则删除整个列并将所有内容向左移动。所以,如果我有类似的东西:

o A B C D ... XYZ

1 2 5 4 9 ... 2

2 3 9 0 1 ... 3

3 1 1 5 6 ... 0

...

75 0.23 0.5 0.6 0.44 ... 0.8

我的计算确定最小阈值为 0.3,然后宏将摆脱 A 列并将其他列向左移动:

o A B C ... XYZ

1 5 4 9 ... 2

2 9 0 1 ... 3

3 1 5 6 ... 0

...

75 0.5 0.6 0.44 ... 0.8

任何帮助都将不胜感激。

4

1 回答 1

3

这应该为你做。如果您删除行或列,则从末尾开始删除并移至开头(即从右到左或从下到上)。

Option Explicit

Sub RemoveColumns()
    Dim vEvalRange As Variant, ii As Integer

    'NOTE: This assumes the usedrange starts at cell A1!

    'Screen updating when deleting cells slows things down
    Application.ScreenUpdating = False

    'Set your evaluation row to an array.  It's faster to sort through variables than sheet ranges
    vEvalRange = ActiveSheet.Range(ActiveSheet.Cells(ActiveSheet.UsedRange.Rows.Count, 1), ActiveSheet.Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)).Value

    'count from right to left otherwise your columns will shift and mess up your array
    For ii = UBound(vEvalRange, 2) To LBound(vEvalRange, 2) Step -1
        If vEvalRange(1, ii) < 0.3 Then
            ActiveSheet.Columns(ii).Delete
        End If
    Next ii

    Application.ScreenUpdating = True
End Sub
于 2012-12-05T07:21:34.517 回答