VEKTORVSFREEMAN, добрый день, дело в том, что при пересчете итеративные формулы с нуля не пересчитываются, нужно вручную перевводить формулу и жать F9 или использовать макрос для их пересчета. И в формулу забыл добавить проверку на ошибки. Заменил формулу в имени на
это имя нужно для работы макроса макрос в модуле листа при изменении ячеек включает итеративные вычисления и пересчитывает все итеративные формулы, которые ссылаются измененные ячейки
[vba]
Код
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) With Application: .DisplayAlerts = 0: .Iteration = 0 If Me.CircularReference Is Nothing Then .DisplayAlerts = 1: Exit Sub Else Dim dic: Set dic = CreateObject("scripting.dictionary") Dim cell As Range, rngRef As Range Set rngRef = Nothing For Each cell In Me.UsedRange.SpecialCells(xlCellTypeFormulas) If Not Intersect(cell.Precedents.Cells, cell) Is Nothing Then dic(cell.Address) = cell.Precedents.Address If rngRef Is Nothing Then Set rngRef = cell.Precedents _ Else Set rngRef = Union(rngRef, cell.Precedents) End If Next cell Dim rngAC As Range, rngSel As Range, strAddr Set rngSel = Selection: Set rngAC = ActiveCell If Intersect(rngRef, Target) Is Nothing Then GoTo lb .ScreenUpdating = 0: .EnableEvents = 0: .Iteration = 1 For Each strAddr In dic.keys .ScreenUpdating = 0: .EnableEvents = 0: If Not Intersect(Range(dic(strAddr)), Target) Is Nothing Then With Range(strAddr) .Select: .Replace "=", "=" Do: .Calculate: Loop Until [check] End With End If Next rngSel.Select: rngAC.Activate lb: .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With Set dic = Nothing Set cell = Nothing: Set rngRef = Nothing: Set rngAC = Nothing: Set rngSel = Nothing End Sub
[/vba]
добавил в файл еще 1 вариант (макрофункцию) [p.s.]Ну не сдержался я, написал макрос [/p.s.] [offtop]
Цитата
добрый день
ну или вечер...
VEKTORVSFREEMAN, добрый день, дело в том, что при пересчете итеративные формулы с нуля не пересчитываются, нужно вручную перевводить формулу и жать F9 или использовать макрос для их пересчета. И в формулу забыл добавить проверку на ошибки. Заменил формулу в имени на
это имя нужно для работы макроса макрос в модуле листа при изменении ячеек включает итеративные вычисления и пересчитывает все итеративные формулы, которые ссылаются измененные ячейки
[vba]
Код
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) With Application: .DisplayAlerts = 0: .Iteration = 0 If Me.CircularReference Is Nothing Then .DisplayAlerts = 1: Exit Sub Else Dim dic: Set dic = CreateObject("scripting.dictionary") Dim cell As Range, rngRef As Range Set rngRef = Nothing For Each cell In Me.UsedRange.SpecialCells(xlCellTypeFormulas) If Not Intersect(cell.Precedents.Cells, cell) Is Nothing Then dic(cell.Address) = cell.Precedents.Address If rngRef Is Nothing Then Set rngRef = cell.Precedents _ Else Set rngRef = Union(rngRef, cell.Precedents) End If Next cell Dim rngAC As Range, rngSel As Range, strAddr Set rngSel = Selection: Set rngAC = ActiveCell If Intersect(rngRef, Target) Is Nothing Then GoTo lb .ScreenUpdating = 0: .EnableEvents = 0: .Iteration = 1 For Each strAddr In dic.keys .ScreenUpdating = 0: .EnableEvents = 0: If Not Intersect(Range(dic(strAddr)), Target) Is Nothing Then With Range(strAddr) .Select: .Replace "=", "=" Do: .Calculate: Loop Until [check] End With End If Next rngSel.Select: rngAC.Activate lb: .ScreenUpdating = 1: .EnableEvents = 1: .DisplayAlerts = 1: End With Set dic = Nothing Set cell = Nothing: Set rngRef = Nothing: Set rngAC = Nothing: Set rngSel = Nothing End Sub
[/vba]
добавил в файл еще 1 вариант (макрофункцию) [p.s.]Ну не сдержался я, написал макрос [/p.s.] [offtop]
Выделить диапазон, Ctrl+H, в поле Найти 0,поле заменить на оставить пустым>кнопка подробнее>>, поставить галочку ячейка целиком, заменить все F5>Выделить>пустые ячейки>ок>Ctrl+->ячейки со сдвигом вверх>ок
Выделить диапазон, Ctrl+H, в поле Найти 0,поле заменить на оставить пустым>кнопка подробнее>>, поставить галочку ячейка целиком, заменить все F5>Выделить>пустые ячейки>ок>Ctrl+->ячейки со сдвигом вверх>окkrosav4ig
Roman777, распакуйте из скачанного файла архиватором файл xlmacr8.hlp и если у вас win 7, то для его открытия потребуется программа, если XP, то открывается двойным тыком
Roman777, распакуйте из скачанного файла архиватором файл xlmacr8.hlp и если у вас win 7, то для его открытия потребуется программа, если XP, то открывается двойным тыкомkrosav4ig
Sub insert_into_dbf() Dim objRS: Set objRS = CreateObject("ADODB.Recordset") Dim ConStr$: ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & ";Extended Properties=dBASE IV" Dim fields$: fields = "kb_a, kk_a, kb_b, kk_b, d_k, summa, vid, ndoc, i_va, da, da_doc, left(nk_a, 38) as nk_a, Left(nk_b, 38) as nk_b, nazn, kod_a, kod_b" With Sheets("rezultat").[L:M]: .Replace "і", "i": .Replace "І", "I": End With 'создаем пустую таблицу и копируем в нее структуру из 4726539.dbf objRS.Open "SELECT * INTO tmp FROM 4726539 WHERE 1>1 ", ConStr 'записываем значения в созданную таблицу objRS.Open "insert into tmp SELECT " & fields & " from [rezultat$] in '" & ThisWorkbook.FullName & "' 'Excel 8.0;'", ConStr Set objRS = Nothing 'переименовываем полученный файл Name ThisWorkbook.Path & "\TMP.DBF" As ThisWorkbook.Path & "\resultat " & Format(Now(), "DD_MM_YYYY hh_mm_ss") & ".dbf" End Sub
[/vba]
ну тогда держите [vba]
Код
Sub insert_into_dbf() Dim objRS: Set objRS = CreateObject("ADODB.Recordset") Dim ConStr$: ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & ";Extended Properties=dBASE IV" Dim fields$: fields = "kb_a, kk_a, kb_b, kk_b, d_k, summa, vid, ndoc, i_va, da, da_doc, left(nk_a, 38) as nk_a, Left(nk_b, 38) as nk_b, nazn, kod_a, kod_b" With Sheets("rezultat").[L:M]: .Replace "і", "i": .Replace "І", "I": End With 'создаем пустую таблицу и копируем в нее структуру из 4726539.dbf objRS.Open "SELECT * INTO tmp FROM 4726539 WHERE 1>1 ", ConStr 'записываем значения в созданную таблицу objRS.Open "insert into tmp SELECT " & fields & " from [rezultat$] in '" & ThisWorkbook.FullName & "' 'Excel 8.0;'", ConStr Set objRS = Nothing 'переименовываем полученный файл Name ThisWorkbook.Path & "\TMP.DBF" As ThisWorkbook.Path & "\resultat " & Format(Now(), "DD_MM_YYYY hh_mm_ss") & ".dbf" End Sub
SergioGach, а можно убрать объединенные ячейки? если можно, то вот мой вариант, проверяйте создал две умные таблицы Список1 и Шаблон в модуле листа Список1 код [vba]
Код
Private Sub copy_rows(num) Dim b As Boolean Dim Список1 As ListObject: Set Список1 = Me.ListObjects("Список1") Dim Шаблон As ListObject: Set Шаблон = Parent.Sheets("Шаблон").ListObjects("Шаблон") rr: If num & "" <> num Or num = "" Then If MsgBox("номер не введений, повторити введення?", 36) = 6 Then num = Application.InputBox("Введіть номер"): GoTo rr Else: Exit Sub End If ElseIf Список1.ListColumns(1).Range.Find(num, , , 1) Is Nothing Then If MsgBox("номер не знайдений, повторити введення?", 36) = 6 Then num = Application.InputBox("Введіть номер"): GoTo rr Else: Exit Sub End If End If Application.ScreenUpdating = 0: Application.EnableEvents = 0 If Not Шаблон.DataBodyRange Is Nothing Then Шаблон.DataBodyRange.Delete Список1.Range.AutoFilter Field:=1, Criteria1:=num Список1.DataBodyRange.Offset(, 1).Resize(, 3).SpecialCells(12).Copy Шаблон.HeaderRowRange(2, 2).PasteSpecial xlPasteValues Список1.Range.AutoFilter Шаблон.Parent.Activate: Шаблон.HeaderRowRange(1).Activate Set Список1 = Nothing: Set Шаблон = Nothing Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub Private Sub test() copy_rows Application.InputBox("Введіть номер") End Sub
[/vba] жмете кнопку, пишете номер или выбираете ячейку с номерм, жмете ОК или Enter
SergioGach, а можно убрать объединенные ячейки? если можно, то вот мой вариант, проверяйте создал две умные таблицы Список1 и Шаблон в модуле листа Список1 код [vba]
Код
Private Sub copy_rows(num) Dim b As Boolean Dim Список1 As ListObject: Set Список1 = Me.ListObjects("Список1") Dim Шаблон As ListObject: Set Шаблон = Parent.Sheets("Шаблон").ListObjects("Шаблон") rr: If num & "" <> num Or num = "" Then If MsgBox("номер не введений, повторити введення?", 36) = 6 Then num = Application.InputBox("Введіть номер"): GoTo rr Else: Exit Sub End If ElseIf Список1.ListColumns(1).Range.Find(num, , , 1) Is Nothing Then If MsgBox("номер не знайдений, повторити введення?", 36) = 6 Then num = Application.InputBox("Введіть номер"): GoTo rr Else: Exit Sub End If End If Application.ScreenUpdating = 0: Application.EnableEvents = 0 If Not Шаблон.DataBodyRange Is Nothing Then Шаблон.DataBodyRange.Delete Список1.Range.AutoFilter Field:=1, Criteria1:=num Список1.DataBodyRange.Offset(, 1).Resize(, 3).SpecialCells(12).Copy Шаблон.HeaderRowRange(2, 2).PasteSpecial xlPasteValues Список1.Range.AutoFilter Шаблон.Parent.Activate: Шаблон.HeaderRowRange(1).Activate Set Список1 = Nothing: Set Шаблон = Nothing Application.ScreenUpdating = 1: Application.EnableEvents = 1 End Sub Private Sub test() copy_rows Application.InputBox("Введіть номер") End Sub
[/vba] жмете кнопку, пишете номер или выбираете ячейку с номерм, жмете ОК или Enterkrosav4ig
Sub ЗаповСпис() Dim n&, arr(), number$ With UserForm1 If .TextBox1.Value = "" Then MsgBox "Поставте дату": Exit Sub Else If .ListBox1.ListCount = 0 Then MsgBox "Список цінностей порожній": Exit Sub Else number = Str(.TextBox1) arr = Array(number, .TextBox2, .ComboBox1, .ComboBox2, .ComboBox3) With Sheets("Список") n = .Cells(.Rows.Count, 1).End(xlUp).Row .[A1:E1].Offset(n).Value = arr End With arr = .ListBox1.List With Sheets("Список1") n = .Cells(.Rows.Count, 1).End(xlUp).Row With .[B1:D1].Offset(n).Resize(UBound(arr) + 1) .Value = arr: .Offset(, -1).Resize(, 1) = number End With End With End With Unload UserForm1 End Sub
[/vba]
так нужно? [vba]
Код
Sub ЗаповСпис() Dim n&, arr(), number$ With UserForm1 If .TextBox1.Value = "" Then MsgBox "Поставте дату": Exit Sub Else If .ListBox1.ListCount = 0 Then MsgBox "Список цінностей порожній": Exit Sub Else number = Str(.TextBox1) arr = Array(number, .TextBox2, .ComboBox1, .ComboBox2, .ComboBox3) With Sheets("Список") n = .Cells(.Rows.Count, 1).End(xlUp).Row .[A1:E1].Offset(n).Value = arr End With arr = .ListBox1.List With Sheets("Список1") n = .Cells(.Rows.Count, 1).End(xlUp).Row With .[B1:D1].Offset(n).Resize(UBound(arr) + 1) .Value = arr: .Offset(, -1).Resize(, 1) = number End With End With End With Unload UserForm1 End Sub
Sub insert_into_dbf() Dim objRS: Set objRS = CreateObject("ADODB.Recordset") objRS.Open "insert into 4726539 SELECT * from [rezultat$] in '" & ThisWorkbook.FullName & "' 'Excel 8.0;'", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV" Set objRS = Nothing End Sub
[/vba] вместо 4726539 напишите имя вашего dbf файла без расширения
если файлы в одной папке [vba]
Код
Sub insert_into_dbf() Dim objRS: Set objRS = CreateObject("ADODB.Recordset") objRS.Open "insert into 4726539 SELECT * from [rezultat$] in '" & ThisWorkbook.FullName & "' 'Excel 8.0;'", _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.path & ";Extended Properties=dBASE IV" Set objRS = Nothing End Sub
[/vba] вместо 4726539 напишите имя вашего dbf файла без расширенияkrosav4ig