0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

配列から列を削除したい時_VBAで

Last updated at Posted at 2023-08-17

配列から不要な列を削除します

エクセルVBAでの内容です。
シートの表を2次元配列に入れて、その後に不要な列を削除したい時にこのコードを使います。


Function 配列の列を削除(myArray As Variant, arrayDeleteCol As Variant)
'配列から対象の列を削除する

    Dim deleteColCount As Long
    Dim arrayRemove
    Dim col As Long
    Dim row As Long
    Dim delColCnt As Long
    Dim isDelCol As Boolean
    Dim ary

    '削除する列の数
    deleteColCount = UBound(arrayDeleteCol) - LBound(arrayDeleteCol) + 1
    
    '削除する列数分だけ減らした配列をつくる
    ReDim arrayRemove(LBound(myArray, 1) To UBound(myArray, 1), LBound(myArray, 2) To UBound(myArray, 2) - deleteColCount)
    
    For col = LBound(myArray, 2) To UBound(myArray, 2)
        
        '削除対象の列か確認
        isDelCol = False
        For Each ary In arrayDeleteCol
        
            If ary = col Then
                isDelCol = True
                Exit For
            End If
        Next
        
        
'        削除対象の列だったら一つ右の内容をずらして入れる
        If isDelCol Then
            
'            削除するので一列分プラスする
            col = col + 1
            
'            削除した回数だけ調整するので足していく
            delColCnt = delColCnt + 1
            
'            最終列が削除対象の時にarrayRemoveの方が範囲が小さいので
'            何もせずに飛ばして終わる
            If UBound(arrayRemove, 2) < col - delColCnt Then Exit For
            
            For row = LBound(myArray, 1) To UBound(myArray, 1)
                arrayRemove(row, col - delColCnt) = myArray(row, col)
            Next
            
'            削除のため調整した列を戻す
            col = col - 1

        Else
            
            For row = LBound(myArray, 1) To UBound(myArray, 1)
                arrayRemove(row, col - delColCnt) = myArray(row, col)
            Next

        End If
    Next

    配列の列を削除 = arrayRemove
      
End Function

使う時の例

こんな表があったとして
※個人情報テストデータジェネレーターです
https://testdata.userlocal.jp/
image.png


Sub 使う時の例()

    Dim myArray
    Dim deleteArray
    
    myArray = ActiveSheet.Range("A1").CurrentRegion
    deleteArray = Array(3, 4)
    
    myArray = 配列の列を削除(myArray, deleteArray)
    
   ThisWorkbook.Worksheets("Sheet2").Range("A1").Resize(UBound(myArray, 1), UBound(myArray, 2)) = myArray
    
End Sub

この場合だとdeleteArray = Array(3, 4)で「年齢、生年月日」を削除指定しているので、このようになります。
image.png

列はEnumとかにしておけば、削除したい列を指定しやすいかもです。
こういう時は、列名をそのまま日本語で使う派です。
col.でインテリセンスきいて日本語出てくれるのが分かりやすいので。
deleteArray = Array(col.年齢, col.性別)みたいに。


Enum col

    氏名 = 1
    ひらがな
    年齢
    生年月日
    性別
    血液型

End Enum

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?