На просторах Интернета не сложно найти SQL функцию, которая считала бы аннуитетный платёж по данным о величине кредита, процентной ставке и сроку кредита. Но вот готовой функции для другой задачи, а именно поиска процентной ставки по данным об аннуитете, сроке и величине кредита, мне найти не удалось. Решение данной задачи не тривиальное и требует применения численных методов. В Excel есть очень удобная для этого функция СТАВКА(), на аналог которой на языке PHP я наткнулся на StackOverflow. Мне оставалось только переписать код для SQL. Результат можно увидеть ниже.

nper — количество платёжных периодов; pmt — аннуитетный платёж; pv — величина кредита. Для поиска решения используется метод хорд.

CREATE OR REPLACE FUNCTION RATE (nper NUMBER, pmt NUMBER, pv NUMBER) RETURN NUMBER
  AS v_result NUMBER;
  fv NUMBER:= 0.0;
  s_type INT:= 0;
  guess NUMBER := 0.1;
  FINANCIAL_MAX_ITERATIONS INT := 5000; --количество итераций
  FINANCIAL_PRECISION NUMBER:= 1.0e-08; --точность
  y NUMBER;
  y0 NUMBER;
  y1 NUMBER;
  f NUMBER;
  i NUMBER;
  x0 NUMBER;
  x1 NUMBER;
BEGIN
v_result := guess;
 
IF (abs(v_result) < FINANCIAL_PRECISION) THEN
y := pv * (1 + nper * v_result) + pmt * (1 + v_result * s_type) * nper + fv;
ELSE
f := EXP(nper * ln(1 + v_result));
y := pv * f + pmt * (1 / v_result + s_type) * (f - 1) + fv;
END IF;
y0 := pv + pmt * nper + fv;
y1 := pv * f + pmt * (1 / v_result + s_type) * (f - 1) + fv;
 
-- поиск корня методом хорд
i := 0;
x0 := 0;
x1 := v_result;
while ((abs(y0 - y1) > FINANCIAL_PRECISION) AND (i < FINANCIAL_MAX_ITERATIONS)) loop
     v_result := (y1 * x0 - y0 * x1) / (y1 - y0);
     x0 := x1;
     x1 := v_result;
     IF ((nper * abs(pmt)) > (pv - fv)) THEN
         x1 := abs(x1);
     END IF;
     IF (abs(v_result) < FINANCIAL_PRECISION) THEN
         y := pv * (1 + nper * v_result) + pmt * (1 + v_result * s_type) * nper + fv;
     ELSE
         f := EXP(nper * ln(1 + v_result));
         y := pv * f + pmt * (1 / v_result + s_type) * (f - 1) + fv;
     END IF;
     y0 := y1;
     y1 := y;
     i:=i+1;
END loop;
    RETURN v_result;
END;
Теги:
 

Возникла очень интересная задача по обработке входящей почты, решением которой хотелось бы поделиться.

Нужно чтобы файлы из входящих писем, которые либо в теле письма, либо в теме, либо в названии файла содержат ИНН, сохранялись в папке с номером ИНН. Кроме того требуется ведения лога поступающих ИНН в отдельном файле.

Эту задачу можно разделить на следующие части:

  • Автоматическое копирование вложений из писем в папку (скрипт решающий эту задачу я уже публиковал)
  • Поиск ИНН в теме письма, теле письма или в названии вложений. Это проще всего сделать с помощью регулярных выражений.
  • Проверка ИНН по контрольному числу
  • Запись информации в лог

Кроме того, в ходе работы над скриптом я заметил ещё одну проблему. Если письмо в формате HTML и в его оформлении используются вложенные картинки, то при попытке сохранить все вложения, эти картинки сохранятся как и остальные файлы. Что не верно. Поэтому нужно ещё отличать видимые и скрытые вложения в письмах и сохранять только видимые.

Продолжить чтение »

Теги:
 

Есть несколько способов поиска определённого текста в теле письма с помощью VBA. Можно воспользоваться функциями InStr, Len, Left или Right, чтобы найти и извлечь текст, а можно воспользоваться регулярными выражениями. Именно о применении регулярных выражений в коде VBA пойдёт речь в данной статье.

Например, требуется извлечь код отслеживания посылки UPS, отправленной с Amazon.com. Такой код имеет формат как на скриншете ниже:

tracking-code-sample-regexp

Нужно находить в тексте слова “Carrier Tracking ID”, затем, возможно, пробел и двоеточие.

.Pattern = "(Carrier Tracking ID\s*[:]+\s*(\w*)\s*)"

Такое выражение извлечёт из текста из примера цифро-буквенный код 1Z2V37F8YW51233715.

Продолжить чтение »

Теги:
 

Возникла следующая задача:

Нужно открыть сообщение Outlook, хранящиеся в определенной папке, а затем получить вложения из этого сообщения и сохранить его.

Это можно сделать, используя Windows Scripting Host и метод Application.CreateItemFromTemplate для открытия сообщений. После открытия, можно сохранить вложения или делать все, что нужно сделать с сообщением.

Продолжить чтение »

Теги:
 

Если на этапе заполнения базы данных разработчики не предусмотрели механизма предварительной проверки правильности e-mail, то полезной будет следующая функция. Она возвращает 1, если адрес электронной почты корректен, и код ошибки в противном случае:

CREATE OR REPLACE FUNCTION EMAIL_CHECK (email varchar2)
--проверяет адрес эл. почты 1 - else - not ok
/********************************************/
--КОДЫ ОШИБОК
--0   Пустой email
--99  Нет символа @ или не заполнено имя пользователя или пароль
--100 Введённый email содержит пробелы в имени пользователя.
--101 Точка (.), в имени пользователя не может быть первым символом.
--102 Минус (-), в имени пользователя не может быть первым символом.
--103 Подчёркивание (_), в имени пользователя не может быть первым символом.
--104 Введённый email содержит недопустимые символы в имени пользователя
--105 Введённый email содержит пробелы в домене.
--106 Домен должен содержать хотя бы одну точку (.).
--107 Точка (.), в домене не может быть первым или последним символом.
--108 Введённый email содержит недопустимые символы в домене
--109 Введённый email содержит недопустимые символы в суффиксе домена (то, что написано после последней точки)
/********************************************/
RETURN INT
IS
 R INT:= 1;
 username VARCHAR(200);
 DOMAIN VARCHAR(200);
 msg VARCHAR(255);
 temp_str VARCHAR(200);
 len INT;
 
BEGIN
IF ltrim(rtrim(email)) IS NOT NULL THEN
 username:=LOWER(substr(email,1,instr(email,'@')-1));
 DOMAIN:=LOWER(substr(email,instr(email,'@')+1,LENGTH(email)-instr(email,'@')+1));
 
-- проверка @ и длины имени пользователя и домена
IF LENGTH(username)=0 OR LENGTH(DOMAIN)=0 THEN
    R := 99;
END IF;
 
-- проверка правильности имени пользователя
IF instr(username,' ')!=0 THEN
    R := 100;
END IF;
 
IF substr(username,1,1)='.' THEN
    R := 101;
END IF;
 
IF substr(username,1,1)='-' THEN
    R := 102;
END IF;
 
IF substr(username,1,1)='_' THEN
    R := 103;
END IF;
 
temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(username,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'.',''),'_',''),'-',''),'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 104;
END IF;
 
 
-- проверка правильности домена
IF instr(DOMAIN,' ')!=0 THEN
    R := 105;
END IF;
 
IF instr(DOMAIN,'.')=0 THEN
    R := 106;
END IF;
 
IF substr(DOMAIN,1,1)='.' OR substr(DOMAIN,LENGTH(DOMAIN),1)='.' THEN
    R := 107;
END IF;
      temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(DOMAIN,'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z',''),'.',''),'-',''),'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 108;
END IF;
 
len:=LENGTH(DOMAIN);
while len>0 loop
   IF substr(DOMAIN,len,1)='.' THEN
     exit;
   END IF;
   len := len - 1;
END loop;
 
temp_str:=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(substr(DOMAIN,len+1,LENGTH(DOMAIN)-len+1),'a',''),'b',''),'c',''),'d',''),'e',''),'f',''),'g',''),'h',''),'i',''),'j',''),'k',''),'l',''),'m',''),'n',''),'o',''),'p',''),'q',''),'r',''),'s',''),'t',''),'u',''),'v',''),'w',''),'x',''),'y',''),'z','');
 
IF LENGTH(temp_str)<>0 THEN
    R := 109;
END IF;
 
ELSE
  R := 0;
END IF;
  RETURN(R);
END;

Продолжить чтение »

Теги:
 

Работа с задачами Outlook из Excel

25 апреля 2013, VBA, Konstantin

Получать информацию о выполненных и будущих задачах, распланированных в соответствующем разделе Outlook, можно с помощью кода из этой статьи. Может, например, пригодиться для автоматического формирования перечня задач находящихся в работе и уже исполненных.

Private Sub LoadTask()
Dim fTasks As Outlook.MAPIFolder
Dim Tasks As Outlook.Items
Set fTasks = Outlook.GetNamespace("MAPI").GetDefaultFolder(olFolderTasks)
Set Tasks = fTasks.Items
Tasks.Sort "[StartDate]", True
For i = 1 To Tasks.Count
	'Тема задачи
	ActiveSheet.Range("A" & i).Value = _
	   Replace(Trim(Tasks(i).Subject), Chr(10), " ")
	'Статус задчи
	If Tasks(i).Complete Then 
		ActiveSheet.Range("B" & i).Value = "Завершена" 
	Else
		ActiveSheet.Range("B" & i).Value = "В работе" 
	End If
	'Тип задчи
	If Tasks(i).IsRecurring Then 
		ActiveSheet.Range("C" & sr).Value = "Регулярная задача"
	Else
		ActiveSheet.Range("C" & sr).Value = "Единичная задача"
	End If
	ActiveSheet.Range("D" & sr).Value = Tasks(i).StartDate
	'Срок окончания задачи
	ActiveSheet.Range("E" & sr).Value = Tasks(i).DueDate 
	'Дата выполнения
	ActiveSheet.Range("F" & sr).Value = Tasks(i).DateCompleted
	'Описание задачи 
	ActiveSheet.Range("G" & sr).Value = Tasks(i).Body 
	ActiveSheet.Range("H" & sr).Value = Tasks(i).Owner
Next i
End Sub

Продолжить чтение »

Теги:
 

CheckBox в ячейках Excel

25 апреля 2013, VBA, Konstantin

Следующий код, помещённый в VBA редакторе на соответствующий лист, позволяет двойным кликом левой кнопки мыши по ячейке в первом столбце устанавливать в ней попеременном галочку, либо крестик.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 With Target
     If .Column = 1 Then
         Select Case .Value
                Case Is = "a"
                     .Font.Name = "Marlett"
                     .Value = "r"
                 Case Is = "r"
                     .Font.Name = "Marlett"
                     .Value = "a"
                 Case Else
                     .Font.Name = "Marlett"
                     .Value = "a"
         End Select
     Cancel = True
     End If
 End With
End Sub

Результат работы макроса выглядит следующим образом:

Excel_CheckBox
Источник

Теги:
 

Если, например, требуется получить одно единственное значение с помощью запроса к базе данных (сам запрос может иметь заранее заданную конструкцию, меняющуюся в зависимости от определённых условий), то пригодится следующией код.

Для MS SQL

Sub Get_MSSQL_Data()
 Dim db As ADODB.Connection
 Dim rs As ADODB.Recordset
 Dim sqlStr As String
 Set rs = CreateObject("ADODB.Recordset")
 Set db = New ADODB.Connection
 db.Open _
  "DRIVER={SQL Server};SERVER=SName;UID=UserName;PWD=Password;DATABASE=DBName"
 
 sqlStr = "SELECT Count(*) as cnt FROM [DBName].[DB].[Table]"
 rs.Open sqlStr, db
 
 While Not rs.EOF
    str1 = rs.Fields("cnt").Value
    rs.MoveNext
    Wend
 rs.Close
 db.Close
End Sub

Продолжить чтение »

Теги:
 

Задача: Есть набор целых чисел (числа не повторяются)

1	3	5	7	8	9	11	2	25	30

Необходимо в Excel написать макрос, который выводит на лист “Результат” все комбинации чисел из набора, дающие в сумме 40. Каждое число можно использовать один раз. Полный перебор комбинаций нежелателен.

Дано: Книга Excel, сотоящая из двух листов. На первом листе (sh1) во второй строке располагается набор целых чисел, а в четвертой строке – необходимая сумма. На втором листе (sh2) будут хранится временные массивы и итоговый результат.

Продолжить чтение »

Теги:
 

Полезное руководство по преобразованию запросов из формата Microsoft SQL в Teradata SQL.

В приведенных примерах ссылка на объект “mufford” — это некое личное хранилище. Следует заменять на собственное.

Команда SELECT

Простой SELECT

SQL Server

1
2
3
4
5
6
USE AdventureWorksDW2012;
GO
 
SELECT TOP 10 ProductKey
  , EnglishProductName 
FROM dbo.DimProduct;

или

1
2
3
SELECT TOP 10 ProductKey
  , EnglishProductName 
FROM AdventureWorksDW2012.dbo.DimProduct;

Teradata

1
2
3
SELECT TOP 10 P_PartKey
  , P_Name 
FROM retail.Product;

Продолжить чтение »

Теги:
 

Нижеследующий код позволяет создать новую книгу Excel из листов текущей книги, содержащей макросы. Также удаляются ненужные кнопки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub ToNewFile()
 pathNewBook = "C:\Temp\" 'Путь сохранения новой книги
 nameNewBook = "Название книги (" & Format(Now, "MMMM YYYY") & ").xlsx"
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 Application.SheetsInNewWorkbook = 1 'Количество листов в новой книге
 Set NewWB = Workbooks.Add
 ThisWorkbook.Activate
 Sheets("Лист 1").Copy Before:=NewWB.Sheets(1)
 NewWB.Sheets(2).Delete
 'Удаляем кнопки
 NewWB.Sheets("Лист 1").Shapes.Range(Array("cbButtonName")).Delete
 NewWB.SaveAs Filename:=pathNewBook & nameNewBook
 NewWB.Close True 'Сохраняем
 Application.CutCopyMode = False
 If Dir(pathNewBook & nameNewBook) <> "" Then
  MsgBox "Создан файл: " & pathNewBook & nameNewBook
 Else
  MsgBox "Не удалось создать файл!"
 End If
End Sub
Sub ToNewFile()
 pathNewBook = "C:\Temp\" 'Путь сохранения новой книги
 nameNewBook = "Название книги (" & Format(Now, "MMMM YYYY") & ").xlsx"
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 Application.SheetsInNewWorkbook = 1 'Количество листов в новой книге
 Set NewWB = Workbooks.Add
 ThisWorkbook.Activate
 Sheets("Лист 1").Copy Before:=NewWB.Sheets(1)
 NewWB.Sheets(2).Delete
 'Удаляем кнопки
 NewWB.Sheets("Лист 1").Shapes.Range(Array("cbButtonName")).Delete
 NewWB.SaveAs Filename:=pathNewBook & nameNewBook
 NewWB.Close True 'Сохраняем
 Application.CutCopyMode = False
 If Dir(pathNewBook & nameNewBook) <> "" Then
  MsgBox "Создан файл: " & pathNewBook & nameNewBook
 Else
  MsgBox "Не удалось создать файл!"
 End If
End Sub

Продолжить чтение »

Теги:
 

Создание примечания для ячейки в Excel с помощью макроса, которое также имело бы сложное внутреннее форматирование, не самая тривиальная задача. Для этого можно воспользоваться например таким кодом:

With Worksheets(1).Cells(4, 12).Comment
   .Visible = False
   .Text "Жирный шрифт:" & Chr(10) & "курсив"
   .Shape.DrawingObject.Characters(1, 13).Font.Bold = True
   .Shape.DrawingObject.Characters(15, 20).Font.Italic = True
End With

В итоге получится примерно такое примечание:

Форматированное примечание ячейки

Продолжить чтение »

Теги:
 

Столкнулся с проблемой ограничения числа пунктов в верхнем меню шаблона WordPress. Если количество пунктов в шаблоне Deep Silent превышает 6, то появляется дополнительный пункт «More Pages»:

Deep Silent До

После продолжительных поисков нашлось решение. В папке с темой хранится файл script.js. В данном файле изменить в строке:

var lastlis = clearlis.slice(6);

цифру 6 на нужное количество пунктов:

var lastlis = clearlis.slice(9);

В итоге можно увеличить отображаемое количество разделов меню:

Deep Silent После

Источник>>

Теги:
 

При создании сохранении новой книги Excel может возникнуть сообщение:

Предупреждение о конфиденциальной информации: документ содержит макросы, элементы управления ActiveX, данные пакета расширения XML или веб-компоненты. Они могут включать личные сведения, которые нельзя удалить с помощью инспектора документов.

Предупреждение о конфиденциальной информации

Решение проблемы:

  • Откройте книгу в Excel.
  • Откройте центр управления безопасностью в Excel.
  • На вкладке Параметры конфиденциальности снимите флажок Удалять личные сведения из свойств файла при сохранении.
  • Сохраните книгу и закройте Excel.

Параметры конфиденциальности

Источник>>

Теги:
 

Чтобы в случае ввода ошибочных данных в таблицу Excel (например, слово вместо цифры в столбец “Номер”) ячейки с ошибками подсвечивались красным фоном, можно воспользоваться условным форматированием. Данный способ удобнее, чем проверка данных, в случае массовой вставки данных из внешнего источника.

Для Excel 2010. Нужно открыть «Условное форматирование» -> «Управление правилами…» -> «Создать правило…» -> «Использовать формулу для определения форматируемых ячеек» и в поле «Форматировать значения, для которых следующая формула является истинной» ввести условие форматирования. Затем, с помощью кнопки «Формат…» выбрать способ подсветки значения.

Продолжить чтение »

Экраны, построенные на основе цветных электронных чернил, кажутся мне одной из наиболее интересных и перспективных технологий. Они смогут стать отличной заменой энергоемких ЖК-экранов в планшетных и даже не только планшетных компьютерах. Главное, к чему стоит стремиться, на мой взгляд, их разработчикам – это увеличение скорости обновления картинки, повышению количества цветов и контрастности, уменьшение стоимости экранов. Сейчас существует две разработки в этой области, которые используются в коммерческих решениях – Mirasol и цветная электронная бумага E-Ink. Первая технология пока значительно выигрывает у второй по скорости обновления изображения, и даёт возможность просматривать даже видео.

Продолжить чтение »

В противовес бесчисленному количеству автобусных, трамвайная экскурсия не только позволяет познакомиться с историей города, но и сама по себе является необычным развлечением. Поискав на просторах Интернета такую услугу в Москве, удалось найти только два подходящих предложения. И то, по-настоящему трамвайной из них оказалась лишь одна.

Трамвай 302-Бис и А

Экскурсионный трамвай 302 – БИС

  • Продолжительность: 1,5 часа (час по Москве, 15 минут по музею)
  • Когда: со среды по воскресенье в 15.00, 17.00 и 19.00
  • Где: ст. метро Пушкинская
  • Стоимость: 500 рублей
  • Сайт: www.dombulgakova.ru

На самом деле, к сожалению, это не трамвай, а лишь стилизованный под него автобус. С другой стороны на трамвае было бы просто не возможно проехать по данному экскурсионному маршруту. Трамвай-музей предлагает гостям путешествие по эпохе 20-30 годов начала века. Начинается маршрут от «Булгаковского Дома». Дальше можно увидеть Сад-Аквариум, театр Сатиры, Тверской бульвар, Дом Грибоедова, Патриаршие пруды, особняк Маргариты и много других мест, связанных с жизнью и творчеством Булгакова.

Трамвай-ресторан

Существует этот трамвай, если судить по статьям в интернете, как минимум с 2005 года. Тогда внутреннее убранство трактира на колесах было не очень привлекательным и напоминало скромную забегаловку на провинциальной дороге. Сейчас же это вполне приличное, красивое место, с опрятными официантами и приятным внутренним интерьером. Во время поездки рассказывают истории любви из жизни знаменитых людей, когда-то живших в Москве. В вагоне играет живая музыка, представляют поэтические номера.

Продолжить чтение »

В Excel 2010 нужно выбрать в меню Файл-> Параметры-> Формулы-> раздел: Работа с формулами-> Стиль ссылок R1C1.

Либо воспользоваться макросом:

Private Sub Change_ColStyle()
If Application.ReferenceStyle = xlA1 Then
   Application.ReferenceStyle = xlR1C1
Else
   Application.ReferenceStyle = xlA1
End If
End Sub

Как изменить заголовки столбцов в Excel 2007 и 2003: Excel — это не сложно!

Продолжить чтение »

Теги:
 

Задача переноса графиков, диаграмм, таблиц из Excel в презентацию PowerPoint осложняется тем, что в последних версиях редактора презентаций (2007, 2010) разработчики убрали возможность записи производимых действий в макрос. Поэтому, для настройки внешнего вида презентации под собственные условия, нужно перерыть документацию по VBA для PowerPoint, либо просмотреть множество специализированных форумов. Ниже приведен код примера создания презентации из диаграмм Excel.

Private Sub export_to_pp()
Set pr = CreateObject("PowerPoint.Application")
Set mpr = pr.Presentations.Add
'Определение имени создаваемой презентации
ppName = "Имя_для_презентации"
'Добавление пустого слайда
Set ppSlide = mpr.Slides.Add(mpr.Slides.Count, ppLayoutBlank)
'Цвет фона слайда
ppSlide.Master.Background.Fill.ForeColor.RGB = RGB(200, 200, 200)
'Добавление блока (Orientation, Left, Top, Width, Height)
'функция Application.CentimetersToPoints переводит сантиметры в пиксели
Set TextShape = ppSlide.Shapes.AddTextbox(1, _
   Application.CentimetersToPoints(1.09), _
   Application.CentimetersToPoints(1.2), _
   Application.CentimetersToPoints(22.86), _
   Application.CentimetersToPoints(1.2))
TextShape.TextFrame.TextRange.Text = "Текст надписи"
'Настройка параметров блока с текстом
TextShape.TextFrame.TextRange.Font.Name = "Calibri"
TextShape.TextFrame.TextRange.Font.Size = 18
TextShape.TextFrame.TextRange.Font.Bold = True
'Отключение автоматического подгона размера блока под текст
TextShape.TextFrame.AutoSize = 0
TextShape.Height = Application.CentimetersToPoints(1.2)
TextShape.TextFrame.TextRange.Font.Color = vbWhite
'Вертикальное выравнивание текста по центру
TextShape.TextFrame.VerticalAnchor = msoAnchorMiddle
'Копируем диаграмму в PowerPoint
ListName.ChartObjects("ChartName").Copy
Set chart1 = ppSlide.Shapes.PasteSpecial(ppPastePNG)
   chart1.Left = Application.CentimetersToPoints(1.52)
   chart1.Top = Application.CentimetersToPoints(3.65)
'Копируем таблицу как OLE object
ListName.Range("H51:M60").Copy
Set table1 = ppSlide.Shapes.PasteSpecial(ppPasteOLEObject)
   table1.Left = Application.CentimetersToPoints(1.52)
   table1.Top = Application.CentimetersToPoints(13.72)
'Копируем таблицу как рисунок
ListName.Range("H61:M70").Copy
Set table2 = ppSlide.Shapes.PasteSpecial(ppPasteEnhancedMetafile)
   table2.Left = Application.CentimetersToPoints(13.16)
   table2.Top = Application.CentimetersToPoints(13.72)
Application.CutCopyMode = False
'Сохраняем презентацию в папке с текущей книгой Excel
mpr.SaveAs (ThisWorkbook.Path + "\" + ppName)
mpr.Close
pr.Quit
End Sub

Продолжить чтение »

Теги:
 

При запуске файла из локальной или глобальной сети, содержащего макрос, может появляться данная ошибка. Причём ошибка появляется сразу же после нажатия кнопки «Разрешить редактирование» в сообщении «Защищенный просмотр».

Разрешить редактирование

При повторном запуске файла ошибка уже не возникает (как и не появляется сообщение о «Защищенном режиме»). При выяснении причины проблемы, дебаггер выделяет строчку в коде, отвечающую за активацию одного из листов книги Excel: Sheets("Лист 1").Activate.

Решение: в свойствах файла Excel на вкладке «Общие» нужно нажать кнопку «Разблокировать» рядом с предупреждением:

Этот файл получен с другого компьютера и, возможно, был заблокирован с целью защиты компьютера

Теги: