2016-07-21 9 views
1

入力xlsファイルヘッダーに基づいて出力XLSファイルを作成する必要があります。私は正確な要件の下に与えています。その明確な希望。そうでなければ私に知らせてください。列見出しに基づいて新しいExcel行を作成し、データを入力する

Iput XLS --> 
ID Version NameLegacy ProjectNumber OwnerName Language Keywords OwnerSite External Content Relevance Periodic Coremap ValidTo 
1 1 Mohan 1000 x ENG ABCD AB No ok no 5 2017-10-14 2018-10-14 
2 2 Shayam 1001 y ENG EFGH BC No ok yes 2 2017-10-14 2018-10-14 
3 1 Sourabh 1002 z ENG IJKL CD Yes no no 4 2017-10-14 2018-10-14 

この入力XLSファイルに基づいて、私は以下のように出力XLSファイルが必要です。入力ファイルの各行は12行の出力ファイルを持ち、それぞれの値は入力ファイルから出力ファイルに書き込まれます。

ID Version IBANAME STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE 
1 1 NameLegacy Mohan       
1 1 ProjectNumber   1000        
1 1 OwnerName x       
1 1 Language ENG       
1 1 Keywords ABCD        
1 1 OwnerSite                      AB       
1 1 External                No   
1 1 Content                          ok       
1 1 Relevance                no       
1 1 Periodic    5       
1 1 Coremap                    2017-10-14  
1 1 ValidTo                    2018-10-14  
2 2 NameLegacy Shayam       
2 2 ProjectNumber   1001        
2 2 OwnerName y       
2 2 Language ENG       
2 2 Keywords EFGH        
2 2 OwnerSite                      BC       
2 2 External                No   
2 2 Content                          ok       
2 2 Relevance                yes       
2 2 Periodic    2       
2 2 Coremap                    2017-10-14  
2 2 ValidTo                    2018-10-14  
3 1 NameLegacy Sourabh       
3 1 ProjectNumber   1002        
3 1 OwnerName z       
3 1 Language ENG       
3 1 Keywords IJKL        
3 1 OwnerSite                      CD       
3 1 External                Yes   
3 1 Content                          no       
3 1 Relevance                no       
3 1 Periodic    4       
3 1 Coremap                    2017-10-14  
3 1 ValidTo                    2018-10-14  

ありがとうございます。

答えて

0

使用してこれを行うにはいくつかのステップがあります。 VBA。主な目的は、あなたが実際にやろうとしていることを特定することです。

レコードのソートを試みて、情報のフォーマットを特定し、そのフォーマットだけに指定された列に配置しようとしているようです。これを行うために、私は非常に単純なカスタム関数を作成しました。

この関数は、ヘッダーの名前を文字列として取り込み、Select/Caseを使用してターゲットシートに必要な列の適切な一致を検索します。これは、あなたの特定のレイアウトにカスタムです。自由に適応するか変更してください。

FUNCTIONは、最後の列の最後の行&を見つけるためのいくつかの他の機能を使用して、ターゲット

Function ColFinder(header As String) As Long 


'Target Column Format = Column # 

'"STRINGVALUE"  = 4 
'"INTEGERVALUE"  = 5 
'"FLOATVALUE"   = 6 
'"FLOATVALUEWITHUNITS"= 7 
'"BOOLVALUE"   = 8 
'"TIMEVALUE"   = 9 
'"URLVALUE"   = 10 
'"REFERENCEVALUE"  = 11 


' **** SET VALUES FOR CASES TO MATCH DESIRED FORMAT ABOVE **** 

'Default to Column 4 StringValue if unknown 
    Select Case header 
     Case "NameLegacy" 
      ColFinder = 4 
     Case "ProjectNumber" 
      ColFinder = 5 
     Case "OwnerName" 
      ColFinder = 4 
     Case "Language" 
      ColFinder = 4 
     Case "Keywords" 
      ColFinder = 4 
     Case "OwnerSite" 
      ColFinder = 10 
     Case "External" 
      ColFinder = 8 
     Case "Content" 
      ColFinder = 11 
     Case "Relevance" 
      ColFinder = 8 
     Case "Periodic" 
      ColFinder = 5 
     Case "Coremap" 
      ColFinder = 9 
     Case "ValidTo" 
      ColFinder = 9 
    End Select 

End Function 

の正しいCOLUMNを見つけること

最終行関数

Function lastRow(sheet As String) As Long 

    lastRow = Sheets(sheet).Cells(Rows.Count, "A").End(xlUp).Row 'Using Cells() 

End Function 

最終列関数これら三つの機能を備えた

Function lastCol(sheet As String) As Long 

    lastCol = Sheets(sheet).Cells(1, Columns.Count).End(xlToLeft).Column 

End Function 

に、あなたがソースシートによる単純なループを実行することができ、一度に1行、その後、データから来ているコラムを参照して見て、適切なターゲット上に置きます。

この例では、同じブックで2つのワークシートを使用しています。変更するには、アドレスを拡張して他のブックまたはシートを追加します。これは概念を表示する単なる最も簡単な方法です。

CODE SHEETS

Sub ColsToRows() 

Dim tRow As Long, sCol As Long, sRow As Long 
Dim source As String, target As String 
Dim tString As String 

source = "Sheet1" 
target = "Sheet2" 

'Set target Row starting point 
tRow = 2 

    'Loop through Source Rows with Data, starting after Header Row 
    For sRow = 2 To lastRow(source) 

     'Loop through each header in Source Row 
     For sCol = 3 To lastCol(source) 

      'Set Basic Columns on Target 
      Sheets(target).Cells(tRow, 1) = Sheets(source).Cells(sRow, 1) 
      Sheets(target).Cells(tRow, 2) = Sheets(source).Cells(sRow, 2) 

      'Get Header Name as Temp String to find which format it requires 
      tString = Sheets(source).Cells(1, sCol) 

      'Label Column 3 of Target 
      Sheets(target).Cells(tRow, 3) = Sheets(source).Cells(1, sCol) 

      'Find Appropriate Column using custom Formula [ColFinder(header As String) As Long] 
      Sheets(target).Cells(tRow, ColFinder(tString)) = Sheets(source).Cells(sRow, sCol) 

      'Advance to next Target Row 
      tRow = tRow + 1 

     Next sCol 

    Next sRow 

End Sub 

ソースシートの例 Source Sheet

対象シート例 Target Sheet

+0

こんにちは..ありがとう..あなたが示唆したVBAコードO/Pに基づいて正確に来た私の要件です。私は合計1 Lacプラスレコードがあります。私はVBAにまったく新しく、マクロは決してそれを使用しませんでした。しかし、私の目的を果たすあなたのソリューションは素晴らしいです。 それは、あなたが私が完全に新しい、そしてどこでどのようにコードを書いて、必要に応じてo/pを手に入れることができるか、より多くの考えを詳述できるなら、大きな助けになるでしょう。事前にTONに感謝します。開発コンソールの場合は – user6622113

+0

F11、次にモジュールを挿入します。コピーしてモジュールに貼り付け、シート名などの詳細を変更します。マクロとしてサブフォームに図形や画像を割り当てたり、Dev Consoleからコードを実行したりすることができます。あなたに役立つオンラインチュートリアルがたくさんあります。 Excel VBAチュートリアルのためのGoogle検索を行います。このコメントを読んでコードを理解しようとするよりも簡単です。長期的には、他の人のコードを修正しようとするよりも、学習にかかる時間を節約できます。それは簡単です。 – peege

+0

ご協力ありがとうございます。あなたのVBAの提案は素晴らしかったです。私は自分の要件に基づいてコードを修正し、それは成功しました。あなたのお手伝いをしていただきありがとうございます。私は別のシートにデータを読み込む際に別の問題に悩まされています。もしあなたがVBAを通して私を助けることができたら。私は別の質問で助けを求めました...私もやっています。 – user6622113

0

Excel内の数式を使用して上位の表を下位の表に変換できます。

最初の2つの列とヘッダー行を除いたすべての入力範囲を、inputという名前の範囲で定義することから始めます。これは、すべての範囲を選択し、「名前ボックス」の「入力」を入力することによって行われます。

Define input range

がワークブックに好き以下の表を作成し、それをすべてとcol_indexを名前付き範囲を定義します

STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE 
NameLegacy ProjectNumber         External Coremap  OwnerSite Content 
OwnerName Periodic          Relevance ValidTo  
Language        
Keywords        

col_index range

この表は、基本的に彼らの新しい場所に元の列をソートします。テーブルに値、行または列を追加することができます。すべてを名前範囲col_indexの下に保つ限り、そのままテーブルに追加できます。

そして別のテーブルヘッダを作成する:

ID Version IBANAME STRINGVALUE INTEGERVALUE FLOATVALUE FLOATVALUEWITHUNITS BOOLVALUE TIMEVALUE URLVALUE REFERENCEVALUE 

次にカラム1-4のそれぞれの最初の行に次の式を貼り付けます

  1. ID:=IF(C2=sheet1!$C$1,A1+1,A1)
  2. バージョン:=VLOOKUP(A2,sheet1!$A$1:$B$4,2)
  3. IBANAMEで最初の12行を選択した後、F2キーを押して、=TRANSPOSE(sheet1!C1:N1)をとして貼り付けます。! (プレスCTRL + +シフト式のボックスに貼り付けた後に入る)
  4. STRINGVALUE:=IF(ISERROR(MATCH($C16,OFFSET(col_index,0,MATCH(D$15,OFFSET(col_index,0,0,1,11),0)-1,5,1),0)-1),"",OFFSET(input,TRUNC((ROW()-ROW($D$16))/COLUMNS(input)),MOD(ROW()-ROW($D$16),COLUMNS(input)),1,1))

次に、ドラッグ列12行ダウンIDVersionは、次のID(行14)に、その値を変更セルA21の値、およびC14=C2の値を使用し、データの最後に達するまでID,VersionおよびIBANAMEの列をドラッグし続けます。最後に、行の末尾にセルD2をドラッグし、すべての表を埋めるために下にドラッグします。 Vectorizing table - formulas

そして、これが値である:それは公式でどのように見えるか

このことは

Vectorizing table - values

それだ;)

+0

HI ..どうもありがとうをループします。 StringValueでは、私は何かが不足している可能性がありません。 STRINGVALUEの入力は何ですか?それを宣言するのはどうですか? = OFFSET(入力、TRUNC((ROW() - ROW($ D $ 2))/ COLUMNS(入力))、MOD(ROW($ D $ 2)、COLUMNS(入力))、1,1) – user6622113

+0

@ user6622113答えの最初に私の編集を参照してください – EBH

+0

質問は明確な方法でフォーマットされていません。ポスターは、それぞれのデータ型が対象シートの独自の列にあることを要求しています。それは、それらがすべてStringValues ...のように見えますが、列は例ではスペースではありません。 1000はIntegerValue、Dateは時刻などです。boolはYes、Noです。 – peege

関連する問題