RAN написал: У вас арихметика хромает, или зрение слабое
Это то, что делает мой код или что это такое? Надо чтобы вот это: Лист("УЧЕТ") Лист("ПРОДАЖИ") N3 M3 J1 K1 L1 M1 N1 O1 P1 N4 M4 N5 M5 N6 M6 N7 M7 N8 M8 N9 M9
По тому же вопросу, подскажите пожалуйста можно ли применить данный код к решению моего вопроса. Конечно требуется изменить его под себя. Главное хотелось бы знать в правильном ли я направлении или этот код совсем не подойдет? Просто таких вычислений очень очень много и я думаю мой файл зависает из за этого.
Код когда то добрый человек написал его на этом форуме для сортировки.
Код
Sub Sort()
Dim shNm1 As String, r1 As Long, c1 As Long
Dim shNm2 As String, r2 As Long, c2 As Long
Dim r As Long, c As Long, rEnd2 As Long, d, dd
shNm1 = "Лист1": r1 = 3: c1 = 12
shNm2 = "Лист2": r2 = 2: c2 = 10
c = c2: r = r1
rEnd2 = Sheets("Лист2").Cells(Rows.Count, 8).End(xlUp).Offset(1, 0).Row 'последняя строка любая с самого конца
Set d = CreateObject("Scripting.Dictionary")
Do Until Sheets(shNm2).Cells(r2, c) = ""
d(Sheets(shNm2).Cells(r2, c).Value) _
= Sheets(shNm2).Range(Cells(r2, c).Address & ":" & Cells(rEnd2, c).Address).Value
c = c + 1
Loop
c = c2
Do Until Sheets(shNm1).Cells(r, c1) = ""
If Not IsEmpty(d(Sheets(shNm1).Cells(r, c1).Value)) Then
Sheets(shNm2).Range(Cells(r2, c).Address & ":" & Cells(rEnd2, c).Address) _
= d(Sheets(shNm1).Cells(r, c1).Value)
End If
d.Remove (Sheets(shNm1).Cells(r, c1).Value)
r = r + 1
c = c + 1
Loop
For Each k In d.keys
Sheets(shNm2).Range(Cells(r2, c).Address & ":" & Cells(rEnd2, c).Address) = d(k)
c = c + 1
Next
End Sub
и я применила код RAN транспонировав его. Все работает.
Код
Dim X() As Variant
Dim Y() As Variant
X = Sheets("ПРОДАЖИ").Range("J1:AC1").Value
Y = Application.WorksheetFunction.Transpose(X)
For i = 1 To UBound(Y)
Sheets("УЧЕТ").Range("N" & i + 2).Value = Val(Sheets("УЧЕТ").Range("M" & i + 2)) - Val(Y(i, 1))
Next
Sub aaa()
Dim x, y, z, rng1 As Range, rng2 As Range, i As Long
x = Sheets("ПРОДАЖИ").Range("J1:AC1").Value
Set rng1 = Sheets("УЧЕТ").Range("N3")
Set rng1 = rng1.Resize(UBound(x, 2))
Set rng2 = rng1.Offset(, -1)
z = rng2.Value
ReDim y(1 To UBound(x, 2), 1 To 1)
For i = 1 To UBound(y)
y(i, 1) = Val(z(i, 1)) - Val(x(1, i))
Next
rng1.Value = y
End Sub
Спасибо AAF! Скажите пожалуйста, почему ваш код быстрее будет работать? Кстати он почему то не работает но никаких ошибок не выдает. Я попыталась найти ошибку но ваш код намного сложнее для моего понятия
Потому что данные берутся в массив, там обрабатываются, а потом сливаются разом на лист. Код в сообщении 40 исправлен
А вот Ваш вариант без .Transpose
Код
Dim X() As Variant
X = Sheets("ПРОДАЖИ").Range("J1:AC1").Value
For i = 1 To UBound(X, 2)
Sheets("УЧЕТ").Range("N" & i + 2).Value = Val(Sheets("УЧЕТ").Range("M" & i + 2)) - Val(X(1, i))
Next
AAF, спасибо! Действительно заметно быстрее работает ваш код. Как можно такие коды писать, просто мозг не выдерживает пока пытаешься проследить цепочку действий.
Я так поняла код RAN тоже можно дальше оптимизировать или перебор и так происходит в памяти?
Код
Private Sub UserForm_Initialize()
Dim ar, i&
ar = Sheets("УЧЕТ").Range("Q1:Q5").Value
For i = 1 To UBound(ar)
Controls("price_c" & i).Caption = "(" & ar(i, 1) & "тг)"
Next
End Sub
Sub test()
Dim arr(), arr1, i&
With Sheets("ПРОДАЖИ")
arr = .Range("J1:AC1").Value
arr1 = Sheets("УЧЕТ").Range("m3").Resize(UBound(arr, 2))
For i = LBound(arr1) To UBound(arr1)
arr1(i, 1) = Val(arr(1, i)) - Val(arr1(i, 1))
Next i
.Range("n3").Resize(UBound(arr1)) = arr1
End With
End Sub
bekzus написал: Здравствуйте, а ваш код будет работать так же быстро?
Так там принцип не поменялся, я только переменные убрал, некоторые. Весь пересчет производится в оперативной памяти. Попробуйте:). Мне, как не профи, он более понятен)
Sub aaa()
Dim x, y, rng1 As Range, i As Long
x = Sheets("ПРОДАЖИ").Range("J1:AC1").Value
Set rng1 = Sheets("УЧЕТ").Range("M3").Resize(UBound(x, 2))
y = rng1.Value
For i = 1 To UBound(y)
y(i, 1) = y(i, 1) - x(1, i)
Next
rng1.Offset(, 1).Value = y
End Sub
AAF, объясните а в чем фишка использования переменной rng1, она же как посредник в принципе не выполняет никакой особо функции? м.б. мой сравнимо небольшой опыт в VBA не позволяет понять смысл использования переменной диапазона в данном примере?
"Все гениальное просто, а все простое гениально!!!"
Nordheim, можно и через With, но используется всего два раза вряд ли есть разница, как я это понимаю... Кроме того, так наглядней код вроде бы выглядит и отладкой удобней заниматься. Почти всегда изначально пишу без With, но после отладки оптимизирую, укорачиваю... Задавался вопросом какая разница между переменной и With, но только где-то в пару местах нашел рекомендации писать через With с точки зрения быстродействия кода. Кроме того авторы не изволили привести доводов ни теоретических, ни ссылок на источник. Я ведь тоже не профессионал...
Я не про with , а про использование переменной диапазона спрашиваю, есть ли смысл, и в чем он заключается. Или смысл в том что бы не использовать конструкцию With?
"Все гениальное просто, а все простое гениально!!!"
Смысл, как и в любой переменной, призванной использоваться в коде более одного раза, но однажды заданной...
Кроме того вот такая конструкция, например:
Код
Sub sss() 'тут Intersect отрабатывает два раза
If Not Intersect(Range("A1:C9"), Rows(10)) Is Nothing Then Intersect(Range("A1:C9"), Rows(10)) = 5
End Sub
Sub test2() 'тут Intersect отрабатывает 1 раз
Set Rng = Intersect(Range("A1:C9"), Rows(10))
If Not Rng Is Nothing Then Rng = 5
End Sub