2016-06-17 25 views
1

私は、SolidWorksインターフェイスで選択された各行の単位ベクトルの値をエクスポートするVBAマクロを作成していますが、それがExcelに書き込まれる前に私はExcelの範囲B2をD2に分類する必要があります(B2は部分ベクトルの部分iを表し、C2は部分jを表し、D2は部分kを表します)。範囲は選択された行の数に依存します。選択された各行はベクトルを表し、各ベクトルはExcelの行を表します。Excel VBAを使用して降順と昇順でデータを並べ替える

列Dでソートして、セルD2の最大値、セルD3の最小値でソートし、そこから昇順に並べ替える必要があります。最初は上がり、次に2番目の行から降りる。

選択した4本のラインがあったのであれば、D列には、次のようになります。

-0.99221 -1 -0.99789 -0.99664

現在、それは次のようになります。

Excel screenshot

しかし、最初にソートする必要があった行の数はわかりません。関連するコードは次のとおりです。

Dim r As Long 
Dim ws As Worksheet 
Set ws = ActiveSheet 

For q = 3 To NumberOfSelectedItems 
Columns("B:D").Sort key1:=Range("D2:D2"), order1:=xlDescending, Header:=xlYes 
r = ws.Cells(ws.Rows.Count, 4).End(xlUp).Rows 
Range("B3:D2" & r).Sort key1:=Range("D2:D2"), order1:=xlAscending, Header:=xlNo 
bRes = WriteToExcel(((q - 1) * 1) + 1, vModelSelPt4, "Unit Vector") 
Next 

現在のところ、このコードでは1004エラーが表示されます。私はそれが間違っているが、確かではない小さなものだと思う。上記の順序でD列でどのように注文すればよいですか?

Private Function WriteToExcel(startRow As Integer, data As Variant, Optional label As String = "") As Boolean 

    'get the results into excel 

    With xlWorkbook.ActiveSheet 
     .Cells(startRow + 2, 2).Value = data(0) 
     .Cells(startRow + 2, 3).Value = data(1) 
     .Cells(startRow + 2, 4).Value = data(2) 
    End With 
End Function 

上記のコードは、Excelにデータを書き込む機能です。それは非常に重要です。これはSolidWorks APIで行われているため、構文は少し異なります。

答えて

0

お客様の質問に投稿された行のうち、私はあなたのカスタム関数WriteToExcel(あなたのコードサンプルには含まれていなかったため、無関係とみなされます)を除いてエラーが表示されませんでした。

この機能でエラーが発生しない限り、上記のコードは問題なく動作します。

並べ替えの場合は、列Dを昇順に並べ替え、並べ替えられた表の行(列Dの最大値を含む)を表の下部から上部に移動することをお勧めします。次subはまさにそれを行います。

Option Explicit 

Public Sub SortIt() 

Dim lngLastRow As Long 

With ThisWorkbook.Worksheets(1) 
    lngLastRow = .Cells(.Rows.Count, "D").End(xlUp).Row 
    With .Sort 
     .SortFields.Clear 
     .SortFields.Add Key:=Range("D2:D" & lngLastRow), _ 
      SortOn:=xlSortOnValues, Order:=xlAscending 
     .SetRange Range("A1:D" & lngLastRow) 
     .Header = xlYes 
     .Apply 
    End With 
    .Range("A2:D" & lngLastRow).Copy Destination:=Range("A3") 
    .Range(.Cells(lngLastRow + 1, 1), .Cells(lngLastRow + 1, 4)).Cut _ 
     Destination:=Range("A2") 
End With 

End Sub 

注意を、上記のコードは、それは、あなたがコードを調整すべき場合ではない場合はシート1上にあるように、テーブルを前提としていること。ご質問やご不明な点がございましたら教えてください。

編集:[コピー]コマンドを[切り取り]に変更しました。

+0

こんにちはRalph、ロジックは素晴らしいと私はそれを私のコードに統合し、それを体の早い段階で呼び出すが、私はそれを実行すると、Excelファイルが空白になります。 A列に各ベクトル1,2,3をラベリングしていることに言及することは重要です。 WriteToExcel関数を以前の投稿にも編集しました。何か案は?ありがとう、コード全体が必要な場合はお知らせください。 – nesco88

+0

上記のコードは、提供したサンプルデータに基づいて意図したとおりに動作します。私が別のデータをテストしたい場合は、この追加/異なるテストデータを投稿してください。あなたが上記のコードを他のコードに統合した場合、あなたがやったことややったことを言うことができず、私のコードがあなたのコード内で意図した通りに動作しないのかどうか、別のコンテキストを考慮したい場合は、考慮するコード全体を投稿してください。それ以外の場合は、上記のコードを単独でテストすると、指定されたテストデータで動作することがわかります。 – Ralph

+0

私はいくつかの実験の後に動作するようになった。最後の "Copy"コマンドを "Cut"に変更しなければなりませんでした。なぜなら、行の1つが2回現れたからです。しかし、私はより多くのテストを続けますが、ありがとう、ありがとう。 – nesco88

関連する問題