私は次の1時間かそこらでこの答えに追加します。アイデアは、私が後のブロックを開発する間、あなたがコードの初期のブロックから始めることです。 編集あなたが求めるかもしれない追加の説明を除いて、私は今答えを完了しました。
私はRBarryYoungに同意します:あなたは誰もがあなたに完全な解決策を提供することを可能にするのに十分な情報を提供しません。また、VBAを学習しようとしている場合、ソリューションを提供しても長期的には役に立ちません。
私は通常、djphaticに同意します。マクロレコーダーは、ユーザーの操作に一致するVBAを学習するのに非常に役立ちますが、マクロレコーダーはこのタスクに必要なVBAの多くを提供しません。
あなたが明らかにそれの準備ができていないときに、誰があなたにこの割り当てを与えたのか興味があります。
画像が読めないので、「MasterTable」という名前のワークシートを作成し、データを読み込んで次のようにしました。
あなたのコメントは、このテーブルのサイズが変わる可能性があることを示唆しているため、最初のタスクはそのサイズを特定することです。テーブルのディメンションを識別するには、さまざまな方法があります。いずれもすべての状況で機能するわけではありません。UsedRangeを使用します。
以下をモジュールにコピーします。
Option Explicit
Sub SplitTable1()
Dim UsedRng As Range
With Worksheets("MasterTable")
Set UsedRng = .UsedRange
Debug.Print UsedRng.Address
Debug.Print UsedRng.Columns.Count
Debug.Print UsedRng.Rows.Count
End With
End Sub
私がお見せするすべてのことを完全に説明する時間はありませんが、最も重要な点を説明しようと思います。
Option Explicit
すべての変数を宣言する必要があることを意味します。このステートメントがないと、スペルミスの名前は自動的に新しい変数を宣言します。
Debug.Print
VBAエディタ画面の下部にあるはずのイミディエイトウィンドウに値を出力します。そこにない場合は、[ Ctrl
+ ]をクリックしますG
。
Dim UsedRng As Range
UsedRng
タイプの変数を宣言しますRange
。範囲はオブジェクトの一種です。オブジェクトに値を割り当てるときは、ステートメントを。で開始する必要がありますSet
。
このマクロを実行すると、イミディエイトウィンドウに次のように出力されます。
$A$1:$H$6
8
6
使用しませんが、UsedRangeとは何か、どのように使用できるかを理解してもらいたいと思いますUsedRng.Address
。UsedRng.Columns.Count
このマクロをモジュールに追加します。
Sub SplitTable2()
Dim CellValue() As Variant
Dim ColCrnt As Long
Dim RowCrnt As Long
With Worksheets("MasterTable")
CellValue = .UsedRange.Value
For RowCrnt = LBound(CellValue, 1) To UBound(CellValue, 1)
Debug.Print "Row " & RowCrnt & ":";
For ColCrnt = LBound(CellValue, 2) To UBound(CellValue, 2)
Debug.Print " " & CellValue(RowCrnt, ColCrnt);
Next
Debug.Print
Next
End With
End Sub
Dim CellValue() As Variant
Variant型の動的配列CellValueを宣言します。 ()
実行時に配列のサイズを宣言することを意味します。
CellValue = .UsedRange.Value
配列CellValueをUserRange内の値に設定します。このステートメントは、必要に応じてCellValueのディメンションを設定します。
CellValue
2次元配列になります。通常、配列の最初の次元は列で、2番目の次元は行ですが、配列が範囲から、または範囲にロードされる場合、これはTRUEではありません。
1次元配列の場合LBound(MyArray)
、配列の下限をUBound(MyArray)
返し、上限を返します。
2次元配列の場合LBound(MyArray, 1)
、配列の1番目のLBound(MyArray, 2)
次元の下限を返し、2番目の次元の下限を返します。
このマクロは、イミディエイトウィンドウに以下を出力します。
Row 1: Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7 Column 8
Row 2: R1C1 R1C2 R1C3 R1C4 R1C5 R1C6 R1C7 R1C8
Row 3: R2C1 R2C2 R2C3 R2C4 R2C5 R2C6 R2C7 R2C8
Row 4: R3C1 R3C2 R3C3 R3C4 R3C5 R3C6 R3C7 R3C8
Row 5: R4C1 R4C2 R4C3 R4C4 R4C5 R4C6 R4C7 R4C8
Row 6: R5C1 R5C2 R5C3 R5C4 R5C5 R5C6 R5C7 R5C8
この2番目のマクロは、ワークシートからすべての値を配列にロードしてから出力できることを示しています。
このマクロをモジュールに追加します。
Sub SplitTable3()
Dim ColourBack As Long
Dim ColourFont As Long
With Worksheets("MasterTable")
ColourBack = .Range("A1").Interior.Color
ColourFont = .Range("A1").Font.Color
Debug.Print ColourBack
Debug.Print ColourFont
End With
End Sub
このマクロを実行すると、次のように出力されます。
16711680
16777215
この答えでは、これらは単なるマジックナンバーです。 16777215
フォントの色を白に16711680
設定し、背景または内部の色を青に設定します。
最後のマクロでは、別のワークシート「SplitTables」を作成しました。
このマクロをモジュールに追加します。
Sub SplitTable4()
Dim CellValue() As Variant
Dim ColDestCrnt As Long
Dim ColourBack As Long
Dim ColourFont As Long
Dim ColSrcCrnt As Long
Dim RowDestCrnt As Long
Dim RowDestStart As Long
Dim RowSrcCrnt As Long
With Worksheets("MasterTable")
' Load required values from worksheet MasterTable
CellValue = .UsedRange.Value
With .Cells(.UsedRange.Row, .UsedRange.Column)
' Save the values from the top left cell of the used range.
' This allows for the used range being in the middle of the worksheet.
ColourBack = .Interior.Color
ColourFont = .Font.Color
End With
End With
With Worksheets("SplitTables")
' Delete any existing contents of the worksheet
.Cells.EntireRow.Delete
' For this macro I need different variables for the source and destination
' columns. I do not need different variables for the source and destination
' rows but I have coded the macro as though I did. This would allow the
' UsedRange in worksheet "MasterTable" to be in the middle of the worksheet
' and would allow the destination range to be anywhere within worksheet
' "SpltTables".
' Specify the first row and column of the first sub table. You will
' probably want these both to be 1 for cell A1 but I want to show that my
' code will work if you want to start in the middle of the worksheet.
ColDestCrnt = 2
RowDestStart = 3
' I use LBound when I do not need to because I like to be absolutely
' explicit about what I am doing. An array loaded from a range will
' always have lower bounds of one.
For ColSrcCrnt = LBound(CellValue, 2) + 1 To UBound(CellValue, 2)
' Create one sub table from every column after the first.
'Duplicate the colours of the header row in worksheet "MasterTable"
With .Cells(RowDestStart, ColDestCrnt)
.Interior.Color = ColourBack
.Font.Color = ColourFont
End With
With .Cells(RowDestStart, ColDestCrnt + 1)
.Interior.Color = ColourBack
.Font.Color = ColourFont
End With
RowDestCrnt = RowDestStart
For RowSrcCrnt = LBound(CellValue, 1) To UBound(CellValue, 1)
' For each row in CellValue, copy the values from the first and current
' columns to the sub table within worksheet "SplitTables"
.Cells(RowDestCrnt, ColDestCrnt).Value = _
CellValue(RowSrcCrnt, LBound(CellValue, 2))
.Cells(RowDestCrnt, ColDestCrnt + 1).Value = _
CellValue(RowSrcCrnt, ColSrcCrnt)
RowDestCrnt = RowDestCrnt + 1
Next RowSrcCrnt
ColDestCrnt = ColDestCrnt + 3 ' Advance to position of next sub table
Next ColSrcCrnt
End With
End Sub
これが実際のマクロです。以前のすべてのマクロは、何かを示すのに役立ちました。このマクロは、私が望むことを実行します。
質問をして戻ってきてください。ただし、現在のタイムゾーンはわかりません。ここは23:00です。1時間くらいで寝ます。その後、明日質問に答えます。