Страницы: Пред. 1 2
RSS
Указание ячеек, откуда берутся данные для Label на пользовательской форме
 
Цитата
bekzus написал:
Listbox совсем мне всю картину испортит на форме. Не так все будет выглядеть как хотелось бы
А можно одним глазком взглянуть на изыск UserForm? (Например в файлике)  :)
Да, и пару сосок будет достаточно....
Изменено: AAF - 17.07.2017 23:07:47
 
Цитата
RAN написал: У вас арихметика хромает, или зрение слабое
Это то, что делает мой код или что это такое?
Надо чтобы вот это:
Лист("УЧЕТ")               Лист("ПРОДАЖИ")
N3 M3                          J1 K1 L1 M1 N1 O1 P1
N4 M4
N5 M5
N6 M6
N7 M7
N8 M8
N9 M9

Лист("УЧЕТ")                
N3 = M3 -  J1                        
N4 = M4 -  K1
N5 = M5 - L1
N6 = M6 - M1
N7 = M7 - N1
N8 = M8 - O1
N9 = M9 - P1
 
Значит упростить такой код сложно я как поняла или вообще невозможно?
 
Я ж говорил, пару сосок оставить... Не лезут? Жаль...
Я думаю упростили бы уже с файлом...
 
Спасибо всем. Доброй вам всем ночи. Извините если кого просто так отвлекла от работы! Без оптимизации обойдусь. И так все работает и довольно быстро. :)
 
Безотносительно, что вам надо, это
Цитата
bekzus написал:
Sheets("УЧЕТ").Range("N3").Value = Val(Sheets("УЧЕТ").Range("M3"))
и это
Цитата
bekzus написал:
Sheets("УЧЕТ").Cells(i + 2, 14).Value = Val(Sheets("УЧЕТ").Cells(i + 2, 15).Value)
разнее вещи (диапазоны).
Как оно может работать одинаково?
 
Значит я ошиблась, извините.
должна была написать так:
Код
Sheets("УЧЕТ").Cells(i + 2, 14).Value = Val(Sheets("УЧЕТ").Cells(i + 2, 13).Value) 
Изменено: bekzus - 18.07.2017 00:06:12
 
По тому же вопросу, подскажите пожалуйста можно ли применить данный код к решению моего вопроса. Конечно требуется изменить его под себя. Главное хотелось бы знать в правильном ли я направлении или этот код совсем не подойдет? Просто таких вычислений очень очень много и я думаю мой файл зависает из за этого.

Код когда то добрый человек написал его на этом форуме для сортировки.
Код
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
 
Ура вроде получилось добиться своего путем транспонирования.

мне надо было чтобы из этого:

Лист("УЧЕТ")               Лист("ПРОДАЖИ")
N3 M3                          J1 K1 L1 M1 N1 O1 P1
N4 M4
N5 M5
N6 M6
N7 M7
N8 M8
N9 M9

добиться этого:

Лист("УЧЕТ")                
N3 = M3 -  J1                        
N4 = M4 -  K1
N5 = M5 - L1
N6 = M6 - M1
N7 = M7 - N1
N8 = M8 - O1
N9 = M9 - P1

и я применила код 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

Файла нет, не проверял...


по сообщению 38 ответ там
Изменено: AAF - 20.07.2017 09:05:43
 
Спасибо AAF! Скажите пожалуйста, почему ваш код быстрее будет работать?
Кстати он почему то не работает но никаких ошибок не выдает. Я попыталась найти ошибку но ваш код намного сложнее для моего понятия
Изменено: bekzus - 20.07.2017 02:35:22
 
Потому что данные берутся в массив, там обрабатываются, а потом сливаются разом на лист.
Код в сообщении 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 - 20.07.2017 10:46:21
 
AAF, спасибо! Действительно заметно быстрее работает ваш код. Как можно такие коды писать, просто мозг не выдерживает пока пытаешься проследить цепочку действий.  :D

Я так поняла код 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
Изменено: bekzus - 21.07.2017 07:19:13
 
Как вариант. Аналог кода от AAF,
Код
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
Изменено: Nordheim - 21.07.2017 08:46:57
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Как вариант. Аналог кода от  AAF ,
Здравствуйте, а ваш код будет работать так же быстро?
 
Цитата
bekzus написал:
Здравствуйте, а ваш код будет работать так же быстро?
Так там принцип не поменялся, я только переменные убрал, некоторые. Весь пересчет производится в оперативной памяти.
Попробуйте:). Мне, как не профи, он более понятен)
Изменено: Nordheim - 23.07.2017 13:23:05
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, Да, там лишние переменные...
Вот:
Код
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 - 23.07.2017 14:17:06
 
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
Изменено: AAF - 23.07.2017 23:47:24
Страницы: Пред. 1 2
Наверх