#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. спасибо за это, я попробую это с моим другом!