2011-06-07 3 views
0

J'essaie de traduire le code VBA trouvé dans this link en IronPython. Quelqu'un peut-il recommander une bonne ressource VBA pour expliquer comment faire mieux pour un programmeur Python?Portage VBA à IronPython

j'ai toutes les parties Excel mises en œuvre, telles que le traitement et l'utilisation des objets, des classeurs, des feuilles de calcul, etc.

Je vais aussi se contenter d'une explication de ce bout de code:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
' Put the index value of the sheet into Arr. Ensure there 
' are no duplicates. If Arr(N) is not zero, we've already 
' loaded that element of Arr and thus have duplicate sheet 
' names. 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
If Arr(N) > 0 Then 
    ErrorText = "Duplicate worksheet name in NameArray." 
    SortWorksheetsByNameArray = False 
    Exit Function 
End If 

pourquoi Arr (N) ne serait jamais plus grand que 0?

Voici mon code actuel, qui est rompu:

def move_worksheets_according_to_list(self, name_list): 
    wb = self.com_workbook 
    temp_list = [] 
    for n in range(len(name_list)): 
     if name_list.count(name_list[n]) > 1: 
      raise Exception("Duplicate worksheet name in NameArray.") 
     else: 
      temp_list.append(wb.Worksheets(name_list[n]).Index) 

    for m in range(len(temp_list)): 
     for n in range(m, len(temp_list)): 
      if temp_list[n] < temp_list[m]: 
       l = temp_list[n] 
       temp_list[n] = temp_list[m] 
       temp_list[m] = l 

    if not all(temp_list[i] <= temp_list[i+1] for i in xrange(len(temp_list)-1)): 
     return False 

    print "current order" 
    for sheet in wb.Worksheets: 
     print sheet.Name 
    wb.Worksheets(name_list[0]).Move(Before=wb.Worksheets(1)) 
    #WB.Worksheets(NameArray(LBound(NameArray))).Move before:=WB.Worksheets(Arr(1)) 
    for n in range(len(name_list)-1): 
     print 'moving ', name_list[n], 'before ', name_list[n+1] 
     wb.Worksheets(name_list[n]).Move(Before=wb.Worksheets(name_list[n + 1])) 

Note:

Avec this answer comme référence, voici tout ce que je devais faire:

def move_worksheets_according_to_list(self, name_list): 
    wb = self.com_workbook 
    l = [] 
    # since wb.Worksheets is a com_object, you can't use the "if _ in XXX" 
    # construct without converting to a list first 
    for s in wb.Worksheets: 
     l.append(s.Name) 

    for n in range(len(name_list)): 
     if name_list[n] in l: 
      wb.Worksheets(name_list[n]).Move(After=wb.Worksheets(wb.Worksheets.Count)) 
+0

@Remou Les contractions sont standard dans l'utilisation informelle, pas dans l'utilisation formelle, ce que l'article wiki rend clair. Voir Strunk et White pour référence. Cependant, il a été clair pour moi que les contractions sont une pratique standard pour SO. Je vais modifier mes pratiques en conséquence. Merci d'avoir noté mon erreur. – JackOrangeLantern

Répondre

0

def move_worksheets_according_to_list (auto, liste_noms): wb = self.com_workbook l = [] # depuis wb.Worksheets est un com_object, vous ne pouvez pas utiliser le "si _ dans XXX" # construction sans conversion à une première liste pour s en wb.Worksheets: l.append (s.Name)

for n in range(len(name_list)): 
    if name_list[n] in l: 
     wb.Worksheets(name_list[n]).Move(After=wb.Worksheets(wb.Worksheets.Count) 
1

Déclarant et le dimensionnement un tableau de longs dans VBA créera le tableau avec la valeur par défaut de 0 dans chaque emplacement.