Страницы: 1
RSS
Вставка в ячейку формулы, содержащей переменные
 
Добрый день. Пожалуйста подскажите.
Есть Public Function "INTD" (интерполяция). Синтаксис следующий: 1. Выделяем массив значений. 2. Число по вертикали. 3. Число по горизонтали.
Массив значений неизменен и находится в одном и том же месте. Проблема с остальными исх данными. Они вычисляются, но их местоположение может быть разным. Для ссылки на конкретную строку в коде отвечает переменная total. т.е. Cells(10+total, 10) это местоположение "Число по вертикали". Аналогично с третьим. Как мне правильно написать код, чтобы макрос вставлял ф-лу intd в нужную мне ячейку. И чтобы после вставки ф-лы, изменив привязанные ячейки, результат пересчитывался. В прилагаемом файле, последняя строка кода и есть моя проблема. Помогите
 
Определитесь, на какую ячейку на листе Глины Вы хотите сослаться? При попытке запустить макрос, у меня эта функция вставилась в ячейку R14C15. Кроме того, как мне кажется, в нескольких местах надо немного подправить:
Код
Sub Расчет()
Dim a As Long 'ячейка с суммарным кол-вом слоев грунтов
Dim b As Long 'отправной номер строки
Dim Cycl As Integer 'переменная кол-ва циклов
Dim C As Double 'мощность 1 слоя грунта
Dim D As Double 'вспомогательная переменная для определения кол-ва составных участков
                'на которые нужно разделить n-ый слой грунта
Dim E As Double 'мощность отдельных участков n-ого слоя
Dim i As Long 'переменная для цикла добавления строк
Dim total As Long 'переменная для определения Глубины от РПГ


a = Cells(8, 1).Value 'суммарное ко-во слоев грунта
b = 10 'номер отправной строки
total = 0


For Cycl = 1 To a 'цикл операций, кол-во циклов = кол-ву слоев грунта
C = Cells(b, 8).Value 'Мощность слоя
D = C / 2 'определение приблизительного числа участков слоя грунта
D = Fix(D)
total = total + D

E = C / D 'определение мощности отдельного участка

For i = 1 To D - 1 'цикл добавления строк
Cells(b + 1, 8).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
Next i

b = b + D 'переназначение переменной, чтобы в след цикле начало было после пред слоя
Range(Cells(b - D, 9), Cells(b - 1, 9)).Value = E 'вставка мощности отдельных слоев в добавленные ячейки
Next Cycl
Cells(10, 10).Formula = "=I10/2" 'глубина от РПГ 1 уч-ка
Range(Cells(11, 10), Cells(11 + (total - 2), 10)).Formula = "=I11/2+I10/2+J10" 'глубина от РПГ всех остальных уч-ов
Cells(10 + total, 7).Value = "Острие"
Cells(10 + total, 10).Value = Cells(11 + (total - 2), 10).Value + Cells(11 + (total - 2), 9).Value / 2
Range(Cells(10, 12), Cells(10 + (total - 1), 12)).Value = 1
Cells(10 + total, 13).Value = 1
Cells(10 + total, 15).FormulaR1C1 = "=intd(глины!R[-6]C[-7]:R[4]C," & Cells(10 + total, 10).Value & "," & Cells(10 + total, 11).Value & ")"
End Sub


   
 
Спасибо, что уделили время. Я исправил ссылку на лист "глины", но проблема не решена. Посмотрите пожалуйста еще раз исправленный файл. И Уточните что именно по-вашему мнению нужно исправить в коде.  Да, забыл. перед запуском макроса нажмите кнопку Reset
Изменено: Stillet - 16.04.2015 14:39:26
 
Не уверен, что правильно понял условия, но попробуйте так. И обратите внимание, что в некоторых местах .Value надо заменить на .Formula. Кроме того, Format  возвращает строку, поэтому лучше использовать Fix или Int.
Код
Sub Расчет()
Dim a As Long 'ячейка с суммарным кол-вом слоев грунтов
Dim b As Long 'отправной номер строки
Dim Cycl As Integer 'переменная кол-ва циклов
Dim C As Double 'мощность 1 слоя грунта
Dim D As Double 'вспомогательная переменная для определения кол-ва составных участков
                'на которые нужно разделить n-ый слой грунта
Dim E As Double 'мощность отдельных участков n-ого слоя
Dim i As Long 'переменная для цикла добавления строк
Dim total As Long 'переменная для определения Глубины от РПГ
 
 
a = Cells(8, 1).Value 'суммарное ко-во слоев грунта
b = 10 'номер отправной строки
total = 0
 
 
For Cycl = 1 To a 'цикл операций, кол-во циклов = кол-ву слоев грунта
C = Cells(b, 8).Value 'Мощность слоя
D = C / 2 'определение приблизительного числа участков слоя грунта
D = Fix(D)
total = total + D
 
E = C / D 'определение мощности отдельного участка
 
For i = 1 To D - 1 'цикл добавления строк
Cells(b + 1, 8).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
Next i
 
b = b + D 'переназначение переменной, чтобы в след цикле начало было после пред слоя
Range(Cells(b - D, 9), Cells(b - 1, 9)).Value = E 'вставка мощности отдельных слоев в добавленные ячейки
Next Cycl
Cells(10, 10).Formula = "=I10/2" 'глубина от РПГ 1 уч-ка
Range(Cells(11, 10), Cells(11 + (total - 2), 10)).Formula = "=I11/2+I10/2+J10" 'глубина от РПГ всех остальных уч-ов
Cells(10 + total, 7).Value = "Острие"
Cells(10 + total, 10).Value = Cells(11 + (total - 2), 10).Value + Cells(11 + (total - 2), 9).Value / 2
Range(Cells(10, 12), Cells(10 + (total - 1), 12)).Value = 1
Cells(10 + total, 13).Value = 1
'Cells(10 + total, 15).FormulaR1C1 = "=глины!R[-10]C[-15]:RC[-8]," & Cells(10 + total, 10).Value & "," & Cells(10 + total, 11).Value & ")"
Cells(10 + total, 15) = INTD(Sheets("глины").Range("D11:J20"), Cells(10 + total, 10).Value, Cells(10 + total, 11).Value)
End Sub



 
МВТ,спасибо, но немного не то. Я бы хотел, чтобы в ячейку вставлялась формула. Чтобы после ее занесения в ячейку, она пересчитывалась, если значение в связанных ячейках изменялось. Это возможно?
 
Кстати, если я правильно понимаю, вот эта ячейка Cells(10 + total, 11).Value  у Вас пустая. Про диапазон на листе "глины" я правильно понял - вся таблица?
 
На данный момент, она пуста. Но это в принципе не имеет значения, т.к. если все верно скопируется в ячейку результат будет 0. Но после занесения туда числа, ф-ла пересчитается. Про диапазон вы правильно поняли. Весь диапазон численных значений. Получается мы интерполируем по этой таблице. Интерполяция по 2 переменным.  
Изменено: Stillet - 16.04.2015 16:36:24
 
Я бы хотел, чтобы после макроса в конечном итоге в ячейке была следующая формула: =INTD(глины!R[-6]C[-12]:R[4]C[-5];RC[-5];RC[-4];)
=INTD(глины!C10:J20;J16;K16) или так в буквенном виде
При других переменных, местоположение будет меняться, но суть та же.
Изменено: Stillet - 16.04.2015 16:40:05
 
Если использовать вот такой код, то вроде формула вставляется, только строка в ней 14, а не 16
Код
Cells(10 + total, 15).Formula = "=INTD( 'глины'!C10:J20" & "," & Cells(10 + total, 10).Address & "," & Cells(10 + total, 11).Address & ")"
Изменено: МВТ - 16.04.2015 17:05:58
 
Уважаемый МВТ, человеческое Вам спасибо. У меня все работает и вставляет в строку 16. Проверил с другим числом слоев, переменная тотал работает. Благодарю Вас
Страницы: 1
Наверх