2017-07-27 5 views
0

私はこのコードを(XFD1の別のシート上で)探していて、その列の値から配列を作成しています。次に、現在のシート上の行を横切ってそれらの値を1つずつ検索しています。一致するものが見つかると、列を切り取り、配列内の値の順序に対応する位置に挿入します。配列内の値の順序に基づいて配列を配列し、ボタンが消える

コンパイルエラーが発生しません。ワークシートにボタン(ActiveXではなく)を配置し、コードを実行するために使用しました。ここに私が見るものがあります:

  1. 何も起きていません。列はまったく動かされません。
  2. コンピュータが明らかに「思考している」のは、whirly-gigが旋回しているからです。
  3. ここでは神秘的な部分です - ボタンが消える!それは決して戻ってこない。私はワークシートにいくつかのボタンを置き、それらをすべて試しました。ボタンは毎回消えます。

これは本当に必要です。私が望むのは、他のシートのリストと同じ順番(リストの95項目)に列を並べ替えることだけです。私はこのコードがそれをするだろうと思ったが、私はトワイライトゾーンに入ったようで、物事は(少なくとも私の視点から)見えない。ここで

それは次のとおりです。

Sub Reorder_Columns() 
    Dim arrColumnOrder(1 To 95) As String 
    Dim index As Integer 
    Dim Found As range 
    Dim tick As Integer 

     For index = 1 To 95 
      arrColumnOrder(index) = UserFormDropDownDataSheet.range("XFD1") 
     Next index 

    Application.ScreenUpdating = False 
    tick = 1 
     For index = LBound(arrColumnOrder) To UBound(arrColumnOrder) 
      Set Found = Rows("1:1").Find(arrColumnOrder(index), LookIn:=xlValues, LookAt:=xlWhole, _ 
      SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) 
       If Not Found Is Nothing Then 
        If Found.column <> tick Then 
        Found.EntireColumn.Cut 
        Columns(tick).Insert Shift:=xlToRight 
        Application.CutCopyMode = False 
        End If 
       tick = tick + 1 
       End If 
     Next index 

    Application.ScreenUpdating = True 
End Sub 
+2

配列に同じ値の95インスタンスを配置するときに、どのように並べ替えると思いますか? – Jeeped

+0

そして、列の挿入によってボタンが「移動」している可能性があります。 –

+0

「親セルで挿入されたオブジェクトを切り取り、コピーして貼り付け」オプションがチェックされていないため、ボタンが消えます。 *オプション>>詳細>>カット、コピー、ペースト* –

答えて

0

私の元のコードが間違っていたものについての質問への答えは次のとおりです。

まず、私は、配列のサイズを設定しようとしていたが、されている必要があります並べ替えようとしているシートに列を追加すると、配列の列のデータが大きくなることが予想されるため、動的配列で作業します。したがって、Dim arrColumnOrder(1 To 95) As StringDim arrColumnOrder As Variantであったはずです。

は、私は、もちろん、すべて間違っている

For index = 1 To 95 
     arrColumnOrder(index) = UserFormDropDownDataSheet.range("XFD1") 
    Next index 

と私の配列を反復処理しようとしていました。私は

 Set Found = Rows("1:1").Find(arrColumnOrder(index), LookIn:=xlValues, LookAt:=xlWhole, _ 
     SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) 

にされている必要があり、その後

arrColumnOrder = UserFormDropDownDataSheet.range("XFD1:XFD95").Value 

でこれを置き換える「... Find (arrColumnOrder(index, 1) ...」

をボタンが動いた理由に対する答えは、私がしなかったことですボタンの書式オプションを設定します(右クリックして、書式コントロール>プロパティ>セルを移動またはサイズしないでください)。列がコピーされ貼り付けられたときのセル。

ここに私の最終的なコードがあり、それは動作し、まさにそれが期待されることをします。つまり、「XFD1:XFD95」の範囲のデータ(適切な順序で列見出しが格納されている別のワークシート上)に配列を作成し、アクティブワークシートの列を並べ替えて、アレイ。私はシート名を明示的に呼びたくはありませんでした。これはさまざまなシート上で実行されるためです。 FindとMatchを使用すると、これは私が扱っている膨大な量のデータではないので、スピードは問題ではないので、私にとってうまくいきます。私にとって

Sub Reorder_Columns() 
    Dim arrColumnOrder As Variant 
    Dim index As Interger 
    Dim Found As range 
    Dim tick As Integer 

    arrColumnOrder = UserFormDropDownDataSheet.range("XFD1:XFD95").Value 
    Application.ScreenUpdating = False 
    tick = 1 
     For index = LBound(arrColumnOrder) To UBound(arrColumnOrder) 
      Set Found = Rows("1:1").Find(arrColumnOrder(index, 1), LookIn:=xlValues, LookAt:=xlWhole, _ 
      SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) 
       If Not Found Is Nothing Then 
        If Found.column <> tick Then 
        Found.EntireColumn.Cut 
        Columns(tick).Insert Shift:=xlToRight 
        Application.CutCopyMode = False 
        End If 
       tick = tick + 1 
       End If 
     Next index 
    Application.ScreenUpdating = True 
End Sub 

、ここで大きな教訓の一つは、私は2つだけ時間寝ている時にコードを記述しようとしないことです!私ははっきりと考えていなかったので、本当に疲れて、愚かな間違いをしていました。私はおやすみを得て、今朝はどこが間違っているかを簡単に確認できました。

関連する問題