2015-10-13 72 views
0

我想根据另一个单元(”sheet2“)对单页(”sheet1“)进行排序,因此将单元格相应地移动到另一个单元格中的单元格移动。“根据另一个(excel 2011)”排序“VBA单页(excel 2011)

例子:

Sheet1: A45 contains number: 3 
sheet2: A45 contains number: 200 

排序(全部)Sheet2的(升序,按列)(它代表百余列)

sheet2 A45 (200) moves to A98 

我想它做的举动:

sheet1 A45 (3) to A98 

今天我正在尝试这个,我知道它的工作原理,但只有PC excel 2003(法语),我不知道为什么它d OES与Mac的Excel 2011(英文)工作:

Sub Test() 
  
    Dim PlageFe1 As Range 
    Dim PlageFe2 As Range 
    Dim Tbl() 
    Dim I As Long 
  
    'plage en colonne A de la Feuille "Feuil1" 
    With Worksheets("Feuil1") 
  
     Set PlageFe1 = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) 
  
    End With 
  
    'plage en colonne A de la Feuille "Feuil2" 
    With Worksheets("Feuil2") 
  
     Set PlageFe2 = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)) 
  
    End With 
  
    'dimensionne le tableau par rapport à une des deux plages (ici la 1) 
    ReDim Tbl(1 To 2, 1 To PlageFe1.Count) 
  
    'fusionne les deux plages dans le tableau 
    For I = 1 To UBound(Tbl, 2) 
  
     Tbl(1, I) = PlageFe1(I) 
     Tbl(2, I) = PlageFe2(I) 
  
    Next I 
  
    'effectue le tri (adapter le signe <ou> dans la porc "Tri") 
    Tri Tbl() 
  
    'puis réaffecte les valeurs 
    For I = 1 To UBound(Tbl, 2) 
  
     PlageFe1(I) = Tbl(1, I) 
     PlageFe2(I) = Tbl(2, I) 
  
    Next I 
  
End Sub 
  
Sub Tri(Tbl()) 
  
    Dim Tempo1, Tempo2 
  
    Dim I As Long, J As Long 
      'éffectue un tri décroissant "<" 
      'pour un tri croissant ">" 
    For I = 1 To UBound(Tbl, 2) - 1 
  
     For J = I + 1 To UBound(Tbl, 2) 
  
      'tri sur l'index 1 
      If Tbl(1, I) > Tbl(1, J) Then 
  
       Tempo1 = Tbl(1, J) 
       Tempo2 = Tbl(2, J) 
       Tbl(1, J) = Tbl(1, I) 
       Tbl(2, J) = Tbl(2, I) 
       Tbl(1, I) = Tempo1 
       Tbl(2, I) = Tempo2 
  
      End If 
  
    Next J, I 
  
End Sub 
+0

两张表如何相互关联?两张表中是否有一列或多列具有相同的唯一值?或者他们只是按照现在的位置相关联? –

+0

本网站不适用于整个代码项目的请求;这是针对具体问题。你有没有尝试过,并在特定的时间点失败?你成功/失败的地方在哪里? –

+0

这两张表都没有关系,所以例外的位置。我很抱歉,但我是VBA的新手,自3周以来我一直在努力寻找网络。从那时起我已经做了几次尝试(主要使用间接... ... – user5441091

回答

0

也许你可以试试这个:

Sub SpecialSort() 

Dim Rng1 As Range, Rng2 As Range, Rng3 As Range 

' Current Selection 
Set Rng1 = Selection 
' Equivalent Selection on sheet 1 
Set Rng2 = Sheets(1).Range(Rng1.Address) 

' Cut the part from the first sheet 
Rng2.Cut 
' Insert it before the range to be sorted 
Rng1.Insert Shift:=xlToRight 
' Keep track of this new inserted part 
Set Rng3 = Rng1.Parent.Range(Rng2.Address) 
' Sort by the column in question 
With Rng1.Parent.Sort 
    .SortFields.Clear 
    .SortFields.Add Key:=Rng1, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    .SetRange Union(Rng1, Rng3): .Header = xlNo: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply 
End With 
' Cut the sorted part 
Rng3.Cut 
' Put it back 
Rng2.Parent.Select: Rng2.Select 
ActiveSheet.Paste 
' Delete the section you cut 
Rng3.Delete Shift:=xlToLeft 

Set Rng1 = Nothing: Set Rng2 = Nothing: Set Rng3 = Nothing 

End Sub 

它可以通过选择范围(包括整列),找到等效范围在第一张纸上,并根据选择的排序方式(使用第一列作为关键字)对第二范围进行排序。

即使这不是你所需要的,也许你可以相应地修改它。

+0

是的,我尝试过类似的方法:每两行插入一个然后使用间接排序,然后使用间接将已排序的数据复制到新工作表中,但是接下来我的问题是:我如何才能对每两列进行排序,包括最后一列和最后一列 – user5441091

+0

,并将其作为VBA重复每两行数太多(超过一百行) – user5441091

+0

对不起,我无法提供帮助,我想我很难理解你想要做什么以及它与我的解决方案有什么不同。祝你好运,希望别人能够更好地协助。 – Demetri