0

私はExcelの完全な初心者であり、今日は明日までに完了する割り当てを取得しました。誰かがこれで私を手伝ってくれるなら、私は本当に感謝するでしょう。次の表のシートがあります。

ここに画像の説明を入力してください

最初のテーブルはマスターであり、そこからデータを取得し、marco-VBAを使用して個別のテーブルの形式で表す必要があります。マクロを使用してこれを達成するための助けをいただければ幸いです。ありがとうございます。

マスターテーブルにn列があるとすると、n-1個の個別のテーブルを作成する必要があります。各テーブルには2列があり、最初の列は常にマスターテーブルの最初の列になり、2番目の列は(n + 1)番目になります。 n番目のテーブルのマスターテーブルの列。例-1番目のテーブルには2つの列(マスターテーブルの1番目の列とマスターテーブルの2番目の列)があり、同様に2番目のテーブルには2つの列(マスターテーブルの1番目の列とマスターテーブルの3番目の列)があります。 ..

4

2 に答える 2

4

私は次の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.PrintVBAエディタ画面の下部にあるはずのイミディエイトウィンドウに値を出力します。そこにない場合は、[ Ctrl+ ]をクリックしますG

Dim UsedRng As RangeUsedRngタイプの変数を宣言しますRange。範囲はオブジェクトの一種です。オブジェクトに値を割り当てるときは、ステートメントを。で開始する必要がありますSet

このマクロを実行すると、イミディエイトウィンドウに次のように出力されます。

$A$1:$H$6
 8 
 6 

使用しませんが、UsedRangeとは何か、どのように使用できるかを理解してもらいたいと思いますUsedRng.AddressUsedRng.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 VariantVariant型の動的配列CellValueを宣言します。 ()実行時に配列のサイズを宣言することを意味します。

CellValue = .UsedRange.Value配列CellValueをUserRange内の値に設定します。このステートメントは、必要に応じてCellValueのディメンションを設定します。

CellValue2次元配列になります。通常、配列の最初の次元は列で、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時間くらいで寝ます。その後、明日質問に答えます。

于 2012-09-16T21:07:42.593 に答える
1

Excel内のマクロレコーダーを見てください。達成しようとしていることは、VBAを使用して、テーブル内の特定の列に単純なコピーと貼り付けを実行するように見えます。マクロレコーダをオンにして、変数と推定列をコピーして貼り付けて最初のテーブルを作成し、停止を押すと、Visual Basic Editor(Ctrl + F11)を表示してコード作成を表示できます。

いくつかの用途のこれらのリンクを見つけることができます: http ://www.automateexcel.com/2004/08/18/excel_cut_copy_paste_from_a_macro/ http://www.techrepublic.com/blog/10things/10-ways-to-reference-excel -workbooks-and-sheets-using-vba / 967

于 2012-09-16T15:41:50.253 に答える