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?

メモ

Last updated at Posted at 2024-11-21

1次元データを2次元データへ並び替える

Option Explicit

' *****************************************************
' 説明
'  1列(1次元)データを〇×〇(2次元)データへ並び替える為のモジュール

' 使い方
'  設定で下記を設定し、Executeを実行する
'    ・シート名
'    ・生成データのMAX行数(createRow)
' *****************************************************

' 設定
Private Const settingsSh As String = "入力"    ' 入力シート
Private Const outputSh As String = "出力"     ' 出力シート
Private Const createRow As Integer = 12       ' 出力データ最終行
Private Const direction As String = "Left"          ' 出力データ生成開始方向 (Right or Left)

' *****************************************************
' 実行ボタン
' *****************************************************
Sub Execute()
    Dim settingsWs As Worksheet
    Dim outputWs As Worksheet
    Dim readCol As Long               ' 読み取り列
    Dim maxRngRow As Integer    ' 出力データの最終行
    Dim sourceData As Variant       ' 読み取りデータ
    Dim outputData As Variant       ' 出力データ
    Dim settingsLastCol As Long
        
    ' シート取得
    Set settingsWs = ThisWorkbook.Sheets(settingsSh)
    Set outputWs = ThisWorkbook.Sheets(outputSh)
    
    ' 出力シートクリア
    Call outputWs.Cells.ClearContents
    
    ' 設定シートから生成データ行数を取得
    maxRngRow = createRow
    
    ' 最終列取得
    settingsLastCol = settingsWs.Cells(1, settingsWs.Columns.Count).End(xlToLeft).Column
    
    Dim i As Long
    For i = 1 To settingsLastCol
        ' 並び替えを行うデータを取得
        readCol = i     ' 読み取りデータ取得列
        sourceData = ReadSettings(settingsWs, readCol)
        
        ' 出力データ作成
        outputData = createData(maxRngRow, sourceData)
        
        Call output(outputWs, outputData)
    Next i
End Sub

' *****************************************************
' データ読込関数(1列データ取得)
' *****************************************************
Function ReadSettings(ws As Worksheet, readCol As Long)
    Dim lastRow As Long
    Dim columnAddress As String
    Dim dataRange As Range
    Dim DataArray As Variant
    Dim maxArrayNum As Long
    Dim reverseDataArray As Variant
    Dim outputWs As Worksheet
    
    ' 列アドレスを取得
    columnAddress = Split(Cells(1, readCol).Address, "$")(1)
    
    lastRow = ws.Cells(ws.Rows.Count, readCol).End(xlUp).Row
    
    ' 指定列のデータ範囲を取得
    Set dataRange = ws.Range(columnAddress & "1:" & columnAddress & lastRow)
    
    ' データ範囲を1次元配列に変換
    DataArray = Application.Transpose(dataRange.Value)
    
'    ' dataArrayを順番を逆にする
'    maxArrayNum = UBound(DataArray)
'    ReDim reverseDataArray(1 To maxArrayNum)
'    Dim i As Long
'    For i = 0 To UBound(DataArray)
'        If maxArrayNum <> i Then
'            reverseDataArray(maxArrayNum - i) = DataArray(i + 1)
'        End If
'    Next i
    
    ReadSettings = DataArray
End Function

' *****************************************************
' 出力データ作成関数
' *****************************************************
Function createData(maxRngRow As Integer, DataArray As Variant) As Variant
    Dim maxRngCol As Integer        ' 出力データの最終列
    Dim outputData As Variant        ' 生成データ
    Dim copyData As Variant
    Dim outputCount As Integer
    
    ' 生成データの最終列を算出
    maxRngCol = UBound(DataArray) / maxRngRow
    
    If maxRngCol * maxRngRow < UBound(DataArray) Then
        maxRngCol = maxRngCol + 1
    End If
    
    ' 初期化
    ReDim outputData(1 To maxRngCol, 1 To maxRngRow)
    outputCount = 0
    
    Dim i As Integer
    Dim j As Integer
    For i = 1 To maxRngRow
        For j = 1 To maxRngCol
            If outputCount < UBound(DataArray) Then
                outputCount = outputCount + 1
                outputData(j, i) = DataArray(outputCount)
            Else
                outputData(j, i) = ""
            End If
        Next j
    Next i
    
    If direction = "Left" Then
        ' 列を逆順にコピー
        Dim reversedArray As Variant
        Dim k As Integer
        
        ReDim reversedArray(1 To maxRngCol, 1 To maxRngRow)
        k = 1
        For j = UBound(outputData, 2) To LBound(outputData, 2) Step -1
            For i = LBound(outputData, 1) To UBound(outputData, 1)
                reversedArray(i, k) = outputData(i, j)
            Next i
            k = k + 1
        Next j
        
        createData = reversedArray
    Else
        createData = outputData
    End If
End Function

' *****************************************************
' 出力処理
' *****************************************************
Sub output(outputWs As Worksheet, outputData As Variant)
    Dim startCell As Range
    Dim outputCol As Long
    
    ' 出力位置列番号取得
    outputCol = outputWs.Cells(1, outputWs.Columns.Count).End(xlToLeft).Column
    If outputCol <> 1 Then
        outputCol = outputCol + 2
    End If
    ' 出力開始位置セル取得
    Set startCell = outputWs.Cells(1, outputCol)
    ' 出力
    startCell.Resize(UBound(outputData, 1), UBound(outputData, 2)).Value = outputData
End Sub

2次元データを1次元データへ並び替える

Option Explicit

' *****************************************************
' 説明
'  〇×〇データ(2次元)を1列(1次元)データへ並び替える為のモジュール

' 使い方
'  設定で下記を設定し、Convert2DArrayTo1Dを実行する
'    ・シート名
'    ・出力方向
' *****************************************************

' 設定
Private Const settingsSh As String = "入力"    ' 入力シート
Private Const outputSh As String = "出力"     ' 出力シート
Private Const direction As String = "Left"     ' データ読み取り開始方向 (Right or Left)

' *****************************************************
' 実行ボタン
' *****************************************************
Sub Convert2DArrayTo1D()
    Dim settingsWs As Worksheet
    Dim outputWs As Worksheet
    Dim startCell As Range
    Dim dataRange As Range
    Dim DataArray As Variant
    Dim outputArray() As Variant
    Dim i As Long, j As Long
    Dim outputIndex As Long
    Dim settingsLaststartCol As Long
    Dim outputCount As Integer
    Dim startCol As Long

    ' シートを設定
    Set settingsWs = ThisWorkbook.Sheets(settingsSh)
    Set outputWs = ThisWorkbook.Sheets(outputSh)
    ' 出力シートクリア
    Call outputWs.Cells.ClearContents
    
    ' 最終列取得
    settingsLaststartCol = settingsWs.Cells(1, settingsWs.Columns.Count).End(xlToLeft).End(xlToLeft).Column
    outputCount = 1
    startCol = 1
    While startCol < settingsLaststartCol - 1
        
        If outputCount <> 1 Then
            startCol = settingsWs.Cells(1, startCol).End(xlToRight).End(xlToRight).Column
        End If
        
        ' 読み取り開始列
        Set startCell = settingsWs.Cells(1, startCol)
        
        ' データ範囲を設定
        Set dataRange = startCell.CurrentRegion
        DataArray = dataRange.Value ' 2次元配列として読み込む

        If direction = "Left" Then
            outputArray = createDataLeft(DataArray)
        Else
            outputArray = createDataRight(DataArray)
        End If

        ' 結果をシートに出力
        outputWs.Cells(1, outputCount).Resize(UBound(outputArray), 1).Value = Application.Transpose(outputArray)
        outputCount = outputCount + 1
    Wend
    
    MsgBox "データの結合が完了しました。", vbInformation
End Sub

' *****************************************************
' 出力データ作成(読み取り方向:左)
' *****************************************************
Function createDataLeft(DataArray As Variant)
    Dim outputArray As Variant
    Dim i As Integer
    Dim j As Integer
    Dim outputIndex As Integer
    
    ' 出力配列のサイズを決定
    ReDim outputArray(1 To UBound(DataArray, 1) * UBound(DataArray, 2))

    ' 2次元配列を1次元配列に変換
    outputIndex = 1
    For j = UBound(DataArray, 2) To LBound(DataArray, 2) Step -1
        For i = LBound(DataArray, 1) To UBound(DataArray, 1)
            If Not IsEmpty(DataArray(i, j)) Then
                outputArray(outputIndex) = DataArray(i, j)
            End If
            outputIndex = outputIndex + 1
        Next i
    Next j
    
    createDataLeft = outputArray
End Function

' *****************************************************
' 出力データ作成(読み取り方向:右)
' *****************************************************
Function createDataRight(DataArray As Variant)
    Dim outputArray As Variant
    Dim i As Integer
    Dim j As Integer
    Dim outputIndex As Integer
    
    ' 出力配列のサイズを決定
    ReDim outputArray(1 To UBound(DataArray, 1) * UBound(DataArray, 2))

    ' 2次元配列を1次元配列に変換
    outputIndex = 1
    For j = LBound(DataArray, 2) To UBound(DataArray, 2)
        For i = LBound(DataArray, 1) To UBound(DataArray, 1)
            If Not IsEmpty(DataArray(i, j)) Then
                outputArray(outputIndex) = DataArray(i, j)
            End If
            outputIndex = outputIndex + 1
        Next i
    Next j
    
    createDataRight = outputArray
End Function

種類出力

' **************************************************
' 種類番号振り分け
' **************************************************
Function KindOutput(cell As Range)
    Select Case True
        Case cell Like "待機*"
            KindOutput = 0
        Case cell Like "走行*"
            KindOutput = 1
        Case cell Like "急速充電*"
            KindOutput = 2
        Case cell Like "200V充電*"
            KindOutput = 3
        Case cell Like "充電前冷却*"
            KindOutput = 4
    End Select
End Function


' **************************************************
' 指定した値の種類値を返す
' **************************************************
Function SumKindOutput(targetCell As Range, searchRange As Range)
    Dim searchArray As Variant
    Dim outputCount As Long
    Dim rngMin As Long
    Dim rngMax As Long
    Dim i As Long
    
    searchArray = searchRange.Value
    
    rngMin = 0
    
    For i = 1 To UBound(searchArray, 2)
        rngMax = rngMin + searchArray(1, i)
        If rngMin < targetCell And rngMax >= targetCell Then
            SumKindOutput = searchArray(2, i)
            Exit For
        End If
        rngMin = rngMax
    Next i
End Function
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?