четверг, 16 мая 2019 г.

Копирование расчетных формул Excel из одного документа в другой

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

Выделите ячейку (ячейки) с формулой, которую вы хотите скопировать. Нажмите сочетания клавиш Ctrl + ` или на ленте «Формулы», раздел «Зависимости формул», кнопка «Показать формулы» (Смотрите рисунок 1).

Рисунок 1. Включение режима показа формул

Откройте блокнот, скопируйте ячейку (ячейки) с формулами и вставьте в блокнот. В блокноте отобразятся формулы, их нужно скопировать из блокнота и вставить в другой документ Excel, предварительно тоже включив «Показ формул» (Смотрите рисунок 1).

Отключите «Показ формул» в обоих документах Excel.

После этого проверьте работу формул.

Перезагрузка компьютера при подключении компьютера к сети или при выборе типа сети под Windows 7 32-64

Несколько раз сталкивался с такой проблемой, что при подключении компьютера к сети или при выборе типа сети «Сеть предприятия» в окне «Настройка сетевого размещения» (Смотрите рисунок 1) компьютер (под управлением Windows 7 32bit и Windows 7 64bit) уходит в перезагрузку.

Рисунок 1. Выбор типа сети в Windows 7

Методом проб и ошибок удалось выяснить, что проблема связана с включённым DEP в Windows 7 или включенным DEP в BIOS компьютера. По крайней мере после отключения DEP в Windows 7 проблема пропала.

Чтобы отключить DEP под управлением Windows 7, то необходимо открыть командную строку от имени администратора и выполнить команду:

bcdedit.exe /set {current} nx AlwaysOff

Когда команда выполнится, то появится сообщение, что «Операция успешно выполнена».  Далее необходимо перезагрузить компьютер.

Чтобы убедится, что DEP отключен, то необходимо:
1. Открыть «Свойства системы»
2. Выбрать пункт «Дополнительные параметры системы»
3. На вкладке «Производительность» нажать кнопку «Настройка»
4. На вкладке «Предотвращение выполнение данных» убедится, что включение DEP запрещена (Смотрите рисунок 2).

Рисунок 2. Отключенный DEP

Если вам понадобится включить DEP, то запустите опять командную строку от имени администратора и выполните следующую команду:

bcdedit.exe /set {current} nx OptIn

Когда команда выполнится, то появится сообщение, что «Операция успешно выполнена».  Далее необходимо перезагрузить компьютер.

Что такое DEP и зачем он нужен можно почитать в Википедии (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%BE%D1%82%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85).
Команды на отключения и включения взяты из статьи по ссылке (http://netler.ru/ikt/windows7-dep.htm).


Kaspersky 11.0.0.6499, синий экран смерти, bsod, windows 10 64 bit

По ходу KasperskyES 11.0.0.6499 даже с установленным патчем pf5074 вызывает синий экран смерти под управлением Windows 10 64 bit. По этому ставим версию KasperskyES 11.0.1.90. 

Сообщение Microsoft Word "Приложению Word не удалось отобразить нужный шрифт, так как недостаточно памяти или места на жестком диске"

Если после обновления с Windows 7 x64 до Windows 10 x64 при открытии документа Word (Office 365 x64) вы получаете сообщение «Приложению Word не удалось отобразить нужный шрифт, так как недостаточно памяти или места на жестком диске» (Смотрите рисунок 1), то исправить данную проблему можно путем копирования шрифтов из папки C:\Windows\Fonts, с нуля установленной Windows 10 на чистый жесткий диск, в папку C:\Windows\Fonts обновленной Windows 10 с Windows 7. Для копирования шрифтом необходимо загрузится с любого загрузочного Live-DVD. Возможно придется воспользоваться программой Unlocker для того чтобы скопировать заблокированные шрифты.

Рисунок 1. Сообщение Microsoft Word

Дополнение 1: Обновление производилось по сценарию «Обновление на месте до Windows 10 с помощью Configuration Manager».
Дополнение 2: Если файл Excel до обновления с Windows 7 на Windows 10 открывался нормально, то после обновления перестал открываться, зависая с надписью файл не отвечает. И не важно каким Microsoft Office это файл пытаются открыть Office 365 x64-x32 или Office 2016. Это тоже связана с проблемой работы шрифтов в Windows 10. Поэтому необходимо произвести замену шрифтов скопированных с Windows 10 установленной с нуля.

Папки в Outlook отображаются на английском языке

В том случае если вы обновили Microsoft Office на более новую версию и при открытие Outlook папки отображаются на английском языке, то необходимо в командной строке перейти в папку, где у вас расположен файл outlook.exe. Для этого выполните следующую команду:

cd /d C:\Program Files\Microsoft Office\root\Office16 

Теперь из командной строки запустите outlook.exe c параметром resetfoldernames, а потом с параметром resetfolders.

outlook.exe /resetfoldernames

outlook.exe /resetfolders

Перезапустите Outlook и проверьте правильно ли отображаются имена папок в Outlook.

Идеи взяты с сайта https://www.dmosk.ru/polezno.php?review=outlook-en

Использование VBScript’s в проектах Delphi

Внимание! Проект создавался в среде программирование Delphi 7 и в операционной системе Windows 7 64 bit.

1. Зачем это нужно? Язык VBScript широко используется для администрирования операционных систем семейства Windows. Delphi в этом плане более ограничена.

2. Например, если вы не можете получить какой-нибудь результат или какую-нибудь информацию от Windows средствами Delphi, то возможно это сможет VBScript.

3. Таким образом наша задача состоит в том, чтобы под средством VBScript получить какую-то информацию в виде строки, передать эту строку в приложение Delphi и вывести результат.

4. Что мы будем проектировать? Не будем ничего выдумывать и напишем программу в Delphi, которая складывает два числа, вводимые нами с клавиатуры. В программу в Delphi мы вводим только два складываемых числа, эти числа передаются VBScript-скрипту. Скрипт их суммирует и результат сложения передает назад в приложение Delphi.

5. С постановкой задачи все. Самое важное, что нам необходимо сделать это установить и подключить компонент, который занимается запуском VBScript-скрипта, приемом и передачей параметров в скрипт и из него.

6. Чтобы установить компонент необходима выбрать пункт меню Component -> Import ActiveX Control (Смотрите рисунок 1).

Рисунок 1. Открытие окна выбора компонента для установки

В списке компонентов найти и выбрать компонент «Microsoft Script Control 1.0» и нажать кнопку Install (Смотрите рисунок 2).

Рисунок 2. Выбор компонента для установки

В окне с именем Install нажать кнопку Ok (Смотрите рисунок 3).

Рисунок 3. Выбор пути установки

В окне Package нажать кнопку Install (Смотрите рисунок 4).

Рисунок 4. Установка компонента

После этого проверить, что компонент установился. Для этого выберите палитру компонентов ActiveX (Смотрите рисунок 5).

Рисунок 5. Просмотр установленного компонента

 7. Создайте новый проект. Для этого выберите пункт меню File -> New -> Application (Смотрите рисунок 6). 

Рисунок 6. Создание нового проекта в Delphi

Сохраните проект под именем, например, p16, как у меня. Перетащите на форму с именем Form1 одну кнопку Button1, два поля ввода Edit1 и Edit2, шесть текстовых меток c Label1 по Label6, и один компонент ScriptControl1. Расположите все элементы как у меня (Смотрите рисунок 7).

Рисунок 7. Расстановка элементов на форме

8. Перейдем к написанию кода приложения Delphi и VBScript-скрипта. Создайте в папке проекта с именем p16 под папку c именем vbscripts. Создайте в этой папке VBScript-скрипт файл с именем sum.vbs. Код скрипта будет следующий:

On Error Resume Next
Function Sum(a,b)
 Sum = a + b
End function

Таким образом скрипт состоит из команды On Error Resume Next, которая продолжает выполнять код даже если возникла какая-то ошибка, и функции с именем Sum, которая выполняет суммирование двух переменных и в качестве результата возвращает их сумму:

Function Sum(a,b)
Sum = a + b
End function

9. Теперь напишем код нашего приложения Delphi. Первым делом рассмотрим обработчик создание формы.

procedure TForm1.FormCreate(Sender: TObject);
var
  ScriptFile: TextFile;
  LineScript: String;
begin
  AssignFile(ScriptFile,'vbscripts/sum.vbs');
  Reset(ScriptFile);

  if IOResult <> 0 then
 begin
   MessageBox(0,'File access error.','Error',0);
  exit;
  end;

  while not EOF(ScriptFile) do
  begin
    readln(ScriptFile, LineScript);
    Script := Script + LineScript+#13+#10;
  end;

  CloseFile(ScriptFile);
end;

В представленном коде мы открываем наш скрипт файл sum.vbs, считываем построчно и сохраняем результат считывания в переменную Script типа String.

10. Далее рассмотрим код обработчика нажатия на кнопку Button1. Данный код выполняет передачу значений Edit1 и Edit2 скрипт файлу. Запуск скрипта на выполнение и получение результат выполнения скрипта.

procedure TForm1.Button1Click(Sender: TObject);
var
  varr, res:Variant;
  pPar:PSafeArray;
  SA : TSafeArrayBound;
  a: Integer;
  b: Integer;
  ValErrorCode: Integer;
begin
  Val(Edit1.Text, a, ValErrorCode);
  Val(Edit2.Text, b, ValErrorCode);

  try
    ScriptControl1.Language := 'VBScript';
    ScriptControl1.AddCode(Script);
    SA.cElements := 2;
    pPar := SafeArrayCreate(varVariant, 1, SA);
    varr := VarArrayCreate([0, 1], varVariant);
    varr[0]:=a;
    varr[1]:=b;
    pPar:=PSafeArray(TVarData(varr).VArray);
    res:=ScriptControl1.Run('Sum',pPar);
    Label5.Caption := VarToStr(res);
  except
    on E: Exception do
      MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
  end;
end;

Далее рассмотрим код более подробно. В этих строчках кода мы берем значения полей ввода Edit1 и Edit2, и сохраняем эти значения в переменных a и b.

Val(Edit1.Text, a, ValErrorCode);
Val(Edit2.Text, b, ValErrorCode);

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

ScriptControl1.Language := 'VBScript';

В следующей строчке кода мы указываем откуда загружать скрипт из переменной Script типа String.

ScriptControl1.AddCode(Script); 

Следующими строчками кода мы передаем складываемые значения a и b скрипту, и запускаем скрипт на исполнение, и получаем результат, который мы выводи в текстовую метку Label5.

SA.cElements := 2;
pPar := SafeArrayCreate(varVariant, 1, SA);
varr := VarArrayCreate([0, 1], varVariant);
varr[0]:=a;
varr[1]:=b;
pPar:=PSafeArray(TVarData(varr).VArray);
res:=ScriptControl1.Run('Sum',pPar);
Label5.Caption := VarToStr(res);

11. Вот как бы и все. Теперь можно ознакомится с работой программы (Смотрите рисунок 8).

Рисунок 8. Результат работы программы

Ниже представлен код полностью:

unit p16_unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, MSScriptControl_TLB;

type
  TForm1 = class(TForm)
    ScriptControl1: TScriptControl;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label6: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
var
  Script: String;

implementation

{$R *.dfm}

uses ActiveX;

procedure TForm1.FormCreate(Sender: TObject);
var
  ScriptFile: TextFile;
  LineScript: String;
begin
  AssignFile(ScriptFile,'vbscripts/sum.vbs');
  Reset(ScriptFile);

  if IOResult <> 0 then
 begin
   MessageBox(0,'File access error.','Error',0);
  exit;
  end;

  while not EOF(ScriptFile) do
  begin
    readln(ScriptFile, LineScript);
    Script := Script + LineScript+#13+#10;
  end;

  CloseFile(ScriptFile);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  varr, res:Variant;
  pPar:PSafeArray;
  SA : TSafeArrayBound;
  a: Integer;
  b: Integer;
  ValErrorCode: Integer;
begin
  Val(Edit1.Text, a, ValErrorCode);
  Val(Edit2.Text, b, ValErrorCode);

  try
    ScriptControl1.Language := 'VBScript';
    ScriptControl1.AddCode(Script);
    SA.cElements := 2;
    pPar := SafeArrayCreate(varVariant, 1, SA);
    varr := VarArrayCreate([0, 1], varVariant);
    varr[0]:=a;
    varr[1]:=b;
    pPar:=PSafeArray(TVarData(varr).VArray);
    res:=ScriptControl1.Run('Sum',pPar);
    Label5.Caption := VarToStr(res);
  except
    on E: Exception do
      MessageDlg(PWideChar(E.Message), mtError, [mbOK], 0);
  end;
end;

end.

Скрипт sum.vbs:

On Error Resume Next

Function Sum(a,b)
 Sum = a + b
End function