У меня ошибка VBA 91 только на Mac, а не на Windows

#excel #vba #windows #macos #object

#excel #vba #Windows #macos #объект

Вопрос:

Вот моя проблема: я закодировал макрос для друга, чтобы помочь ему сэкономить время для своей работы. Он работает на моей машине, но не на его, и я не знаю почему. Ошибка, которую он имеет: «Ошибка 91», и отладчик указывает на строку «iCol = s2.Range(«1:1»).Find(что: = v2, после:= s2.Range(«C1″)).Column».

Вот цель макроса: определить среди его клиентов тех, кто предъявляет несколько требований при повышении цен. Поэтому я вычисляю вариации, а затем представляю их горизонтально, упорядоченные по клиенту и дате.

Вот немного предыстории: я совсем новый программист, и это мой первый проект на VBA. Я сделал это методом проб и ошибок и собирал воедино фрагменты кода, найденные здесь и там.

Я работаю на ноутбуке с Windows с Excel 365, мой друг на Mac с Excel 365.

Вот что я попробовал: я посмотрел на тип iCol, который представляет собой номера столбцов (объявленные как длинные). Поэтому я не понимаю, почему это должно быть объектом, когда на самом деле это число. Я попытался объявить iCol как объект, но не смог заставить его работать (несоответствие типов, которое я понимаю, потому что это действительно число). Теперь я застрял и нуждаюсь в помощи, пожалуйста

 Sub Transpo_dates()
 Sheets("macro_dates2").Cells.Clear
 Sheets("macro_dates_results").Cells.Clear
 Sheets("dates1").Range("a4").CurrentRegion.Copy Destination:=Sheets("macro_dates2").Range("A1")

 Sheets("macro_dates2").Range("A1").CurrentRegion.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
 
 Dim last_row As Long
 Dim j As Long
 last_row = Sheets("macro_dates2").Cells(Rows.Count, 1).End(xlUp).Row 

 Cells(1, 5) = "variations"
 For j = 3 To last_row
 If Cells(j, 1).Value = Cells(j - 1, 1).Value Then
  If Cells(j - 1, 4).Value = "" Then
   Cells(j, 5).Value = 42
  Else
   Cells(j, 5).Value = (Cells(j, 4).Value - Cells(j - 1, 4).Value) / Cells(j - 1, 4).Value
   Cells(j, 5).NumberFormat = "0.0%"
  End If
 End If
Next j

Dim s1 As Worksheet
Dim s2 As Worksheet
Dim N As Long
Dim i As Long
Dim v1 As String
Dim v2 As Date
Dim v3 As Double
Dim iRow As Long
Dim iCol As Long

Set s1 = Sheets("macro_dates2")
Set s2 = Sheets("macro_dates_results")
N = s1.Cells(Rows.Count, "A").End(xlUp).Row 


s1.Range("A2").CurrentRegion.Copy s1.Range("G1")
s1.Range("G1").CurrentRegion.Sort key1:=Range("I1"), order1:=xlAscending, Header:=xlYes

s1.Range("G1").CurrentRegion.Copy s1.Range("M1") 'je copie encore
s1.Range("M:M").RemoveDuplicates Columns:=1, Header:=xlNo 'suppr doublons noms
s1.Range("M2").CurrentRegion.Sort key1:=Range("M2"), order1:=xlAscending, Header:=xlYes 

s1.Range("M2:M" amp; N).Copy Destination:=s2.Range("C2") 
s1.Range("I1:I" amp; N).Copy Destination:=s2.Range("A2") 
s2.Range("A:A").RemoveDuplicates Columns:=1, Header:=xlNo 

s2.Range("A2:A" amp; N).Copy 
s2.Range("C1").PasteSpecial Transpose:=True 

s2.Range("A2:A" amp; N).Clear 

For i = 2 To N 
 v1 = s1.Cells(i, 7).Value
 v2 = s1.Cells(i, 9).Value 'dates
 v3 = s1.Cells(i, 11).Value
 iRow = s2.Range("C:C").Find(what:=v1, after:=s2.Range("C1")).Row
 '*** BELOW IS THE LINE POINTED BY THE DEBUGGER/ iCol = ... ***
 iCol = s2.Range("1:1").Find(what:=v2, after:=s2.Range("C1")).Column 
 s2.Cells(iRow, iCol) = v3
 s2.Cells(iRow, iCol).NumberFormat = "0.0%"
Next i


Sheets("macro_dates2").Range("I:I").EntireColumn.AutoFit
Sheets("macro_dates2").Range("J:J").EntireColumn.AutoFit
Sheets("macro_dates2").Range("O:O").EntireColumn.AutoFit

Sheets("macro_dates2").Range("P:P").EntireColumn.AutoFit
Sheets("macro_dates_results").Cells.EntireColumn.AutoFit
End Sub
 

Комментарии:

1. Просто предположение, даты отформатированы одинаково на обеих машинах? во втором цикле… Я знаю, что Mac использует другую начальную дату начала календаря, чем ПК — будет ли это иметь значение?

2. @SolarMike спасибо за идею, которая могла бы сыграть. Я проверю это у своего друга

Ответ №1:

 Dim result1 as Range, result2 as Range
...
For i = 2 To N 
  ...
  Set result1 = s2.Range("C:C").Find(what:=v1, after:=s2.Range("C1"))
  Set result2 = s2.Range("1:1").Find(what:=v2, after:=s2.Range("C1"))
  'prevent run-time error 91
  If (Not result1 is Nothing) And (Not result2 is Nothing) Then 
    iRow = result1.Row
    iCol = result2.Column 
    s2.Cells(iRow, iCol) = v3
    s2.Cells(iRow, iCol).NumberFormat = "0.0%"
  End If
Next i
 

Комментарии:

1. спасибо за это, я попробую это с моим другом!