0

関係のない分類問題のデータ セットがあり、実際に問題が発生しています。属性の合計数を減らしたいと考えています。私は自分のデータセットを非常にうまく処理できるCSV形式に入れましたが、いくつかの変更を加える必要があります.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 に答える