Ув. gling, спасибо. Ваш вариант работает вообще без торможения, но это все же диапазон, а не вся строка или столбец... Но возможно, что так тоже получится, буду думать в этом направлении. Еще раз спасибо!
К сожалению тормозит так же, но только из-за ScreenUpdating = False не отображает процесс. Проверил на двух компьютерах с разными офисами (2013 и 2019)
Добрый день! У меня есть рисунки сделанные с помощью закрашенных ячеек. Иногда мне нужно какой-нибудь рисунок изобразить либо слева-направо или вверх "ногами". Я написал два коротюсеньких макроса, которые работают:
Код
Sub HorizontalSpiegeln()
For i = 1 To 20
With Worksheets("buch 1")
.Columns(i).Select
Selection.Copy
.Cells(1, 45 - i).Select
.Paste
End With
Next i
End Sub
Sub VertikalSpiegeln()
For i = 1 To 20
With Worksheets("buch 1")
.Rows(i).Select
Selection.Copy
.Cells(45 - i, 1).Select
.Paste
End With
Next i
End Sub
НО, после быстрого прохождения первых 6 - 7 строк или 6 - 7 столбцов Excel начинает сильно тормозить.
Hugo, спасибо за ответ и за то, что потратили на меня время. У меня на Office 2013 мелькает курсор. Не сильно, очень кратковременно, но мелькает. Во всяком случае я это вижу. Попробую завтра на другом Excel.
Добрый день! у меня есть есть несколько диапазонов из 4-х ячеек, в которые по клику ставятся крестики. В каждом диапазоне может быть только один крестик. Поэтому я сначала очищаю диапазон, а потом в нужную ячейку вношу крестик. Все работает, мелькает (как я понимаю при очищении ячеек)
Как это можно исправить? Или причина в чем-то другом?
Вот макрос:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
Dim r As Integer
If Target.Cells.Count > 1 Then Exit Sub
ActiveSheet.Unprotect Password:=""
If Not Intersect(Target, Range("C11:F11", "C12:F12")) Is Nothing Then
r = Target.Row
If Target = vbNullString Then
i = 0
Else
i = 1
End If
Application.ScreenUpdating = False
For Each Z In Range(Cells(r, 3), Cells(r, 6))
Z.Value = vbNullString
Next
Application.ScreenUpdating = True
Target.Font.Name = "Wingdings 2"
If i = 0 Then
Target = "Ð"
Else
Target = vbNullString
End If
End If
ActiveSheet.Protect Password:=""
Создаю Word-документ макросом из Excel-файла. Мне надо просто проверить правописание, после чего закрыть Word-файл без сохранения.
Файл создается. Но, после того, как я с ним поработал и хочу закрыть он сначала выдает запрос на сохранение, а когда я говорю "не сохранять" он пишет, что файл используется другим приложением или пользователем и в скобках пишет путь к Normal.dotm. Можно ли сделать так, чтобы этот созданный файл закрывался без запроса на сохранение или (если с запросом), чтобы по нажатию "не сохранять" он закрылся.
Вот текст макроса:
Код
Sub WordCreate()
'On Error Resume Next
Dim WordApp As Object
Dim WordDoc As Object
Dim ExcelTable As Range
Dim i As Integer
Dim Pos_Massnahme() As String
i = Sheets(ActiveSheet.Name).Cells(2, 2).Value
Set ExcelTable = ThisWorkbook.Sheets("VD-LN").Range(Cells(8, 5), Cells(8 + i, 5))
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
Set WordDoc = WordApp.Documents.Add
ExcelTable.Copy
WordApp.Selection.PasteExcelTable LinkedToExcel:=False, WordFormatting:=False, RTF:=False
Application.CutCopyMode = False
Set WordDoc = Nothing
Set WordApp = Nothing
End Sub
ув. sokol92, ув. Marat Ta,спасибо ребята!! Как все просто, когда знаешь. Мне теперь даже и именованные диапазоны удалять не надо, поскольку в диспетчере имен их нет изначально. Здорово!!
Пока не понял, что делает SaveData = False. Попробовал, вроде не на что не влияет. Диапазоны и подключения убирает . Delete
Спасибо, что ищете решение, но я уже исправил код записи в файл, так что все работает. Но вопрос остается: ПОЧЕМУ? это происходит из-за увеличения длины строки в текстовом файле.
New написал: Почему кнопки из-за этого уезжают правее - не знаю
Вот и я не знаю... Причем, алгоритм записи в файл в 9 случаях из 10 выдает правильный результат, а один раз вот такое удлинение. Но с алгоритмом я разберусь. Мне не ясно каков механизм влияния на смещение кнопок внутри Excel'я. Задача-то тривиальная строки с разделителями переносятся в Excel-таблицу. И какая разница сколько полей предопределено текстовым файлом.
Marat Ta, я так и делаю. Я просто для примера все выбросил оставил только ту часть, которая выдавала не то что хотелось. На самом деле Excel файл только показывает расшифрованное содержимое текстового файлы, а в случае добавления записи - зашифровывает и сохраняет уже зашифрованный текст в текстовом файле (видимо при этой записи в файл у меня и ошибка - сейчас проверяю где именно). Сам же Excel ничего в Excel-файлах не сохраняет - он пустой.
Добрый день! Подскажите если знаете в чем кроется причина. Макрос загружает из текстового файла, в котором поля разделены точкой с запятой, таблички на листы Excel. Макрос для всех листов один и тот же. Текстовые файлы однотипные. Ну текст он и в Африке текст... Так вот, на одном листе все загружается нормально, а на другом, вроде как добавляются колонки слева, в которые и происходит запись (это видно по кнопкам, которые уезжают вправо).
Для примера удалил все, что можно. Оставил только сам макрос (который был записан средствами Excel, с последующими незначительными изменениями). В файле два листа, на каждом кнопка "загрузить".Лист test1 грузит из файла test1.txt, а лист test2 - из файла test2.txt (имена листов соответствуют названию файлов) с test2 все нормально, a test1 глючит.
Прикладываю сам excel файл и ещё оба текстовых файла - все должны лежать в одной папке. Да, в текстовых файлах текст - это просто символы юникода, поскольку текстовое (читаемое) содержимое должно быть зашифровано. Сам макрос:
ув. Kuzmich, я вот так Вашим кодом воспользовался:
Код
Sub tt2()
Dim i As Integer
Dim max As Integer
Dim r As Integer
Dim sl: Set sl = CreateObject("Scripting.Dictionary")
max = WorksheetFunction.CountA(Sheets("Main").Columns(1))
Randomize
i = 1
With Sheets("Main")
Do
r = Int(Rnd * max + 1)
If Not sl.exists(r) Then
.Cells(i, 2).Value = .Cells(r, 1)
.Cells(i, 3).Value = r
sl.Add r, 1
i = i + 1
End If
Loop While sl.Count < 5
End With
'Set sl = Nothing
End Sub
Kuzmich написал: оно заносится в соответствующую ячейку
Спасибо, понял и так пять раз. Есть 3 вопроса. 1. А зачем массив, можно же непосредственно с колонкой А работать? Я читал, что Excel массивы обрабатывает быстрее, но сначала все скопировать в массив (а там может быть от 2000 слов и выше), а потом из него выбирать... и все из-за 5 выбранных слов? 2. Вы в конце пишете Set sl = Nothing. Как я понимаю - освобождаете память. А что при закрытии файла память не освобождается? 3. Вы Randomize вставили внутрь цикла. Я тоже так поступал (и в различных примерах видел), но Александр Моторин своем коде вынес его за пределы цикла. Я сделал тестовый файлик и попробовал и так, и так (десять раз выбирал по 10 цифр из массива обеими способами). По-моему и за пределами цикла (то есть один раз) Randomize обеспечивает случайность всех последующих random'ов. Или это не так?
ув. Kuzmich, спасибо за ответ. Но я уже использовал решение Александра Моторина. Все работает быстро и, вроде, без сбоев. Кроме того, оно мне понятнее. Я, к своему стыду, не очень понял, что в Вашей процедуре происходит
Здравствуйте! Колонка А заполнена словами. Выбираю случайным образом 5 слов и записываю в колонку В. Но иногда (поскольку выбор случаен) выбираются одинаковые слова.
Код
Sub aaa()
Dim i As Integer
Dim max As Integer
Dim r As Integer
max = WorksheetFunction.CountA(Sheets("Main").Columns(1))
With Sheets("Main")
For i = 1 To 5
Randomize
r = WorksheetFunction.Round(Rnd * (max - 1), 0) + 1
.Cells(i, 2).Value = .Cells(r, 1)
.Cells(i, 3).Value = r
Next i
End With
End Sub
Искал здесь и не только здесь - в основном приводится задача выбора из массива с повторами всех уникальных значений. А у меня в основном массиве повторов нет. Я предполагаю, что сравнение надо делать не по словам, а по номеру строки, но... как-то у меня очень громоздко получается (и дополнительные массивы ввожу, и циклы в цикле в цикле...). Думаю есть какое-то простое решение.
У меня программка-словарь отображает карточку с русским словом (в окне MsgBox) затем с его иностранным переводом (тоже в окне MsgBox, а затем вписывает эту пару в таблицу Excel. Написал так (If - потому что по случайному выбору сначала показывается либо русское слово, либо иностранное):
Код
If l = 0 Then
Msgbox De
Msgbox Ru
Else
Msgbox Ru
Msgbox De
End If
Sheets("Main").Cells(14 + i, 6).Value = De
Sheets("Main").Cells(14 + i, 7).Value = "-"
Sheets("Main").Cells(14 + i, 8).Value = Ru
Работает, но странно (во всяком случае для меня). Сначала показывается первый Msgbox. После нажатия OK появляется второй Msgbox. После нажатия ОК, по идее в таблицу должны вписаться оба слова, но вписывается только одно (иностранное слово), в первую строку первой колонки. Затем после закрытия пары следующих Msgbox'ов - дописывается второе слово (русское из первой пары Msgbox'ов) в первую строку второй колонки и первое слово - во вторую строку первой колонки. И так все время. Ставлю точку прерывания - код отрабатывается правильно причем если программа останавливается на точке прерывания, то в таблицу все вносится корректно. Пробовал давать задержку в 1 сек. - не помогло. Решил так:
Код
If l = 0 Then
Msgbox De
Sheets("Main").Cells(14 + i, 6).Value = De
Sheets("Main").Cells(14 + i, 7).Value = "-"
Msgbox Ru
Sheets("Main").Cells(14 + i, 8).Value = Ru
Else
Msgbox Ru
Sheets("Main").Cells(14 + i, 7).Value = "-"
Sheets("Main").Cells(14 + i, 8).Value = Ru
Msgbox De
Sheets("Main").Cells(14 + i, 6).Value = De
End If
но как-то некрасиво получается одинаковые команды дублировать.
Подскажите, плз. как это исправить. Может это только у меня "кривой" Excel (или руки ) Вот "облегченный" файл вкладываю. Посмотрите если не лень...