Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Записи участника (krosav4ig) - Мир MS Excel

Старая форма входа
Мир MS Excel » Записи участника » krosav4ig [2347]
Результаты поиска
krosav4ig Дата: Четверг, 17.04.2014, 18:13 | Сообщение № 21 | Тема: "..." - не многоточие
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Это все из-за автозамены. Чтобы в ячейку ввести значение ...1... нужно удалить соответствующее отключить правило автозамены.


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеЭто все из-за автозамены. Чтобы в ячейку ввести значение ...1... нужно удалить соответствующее отключить правило автозамены.

Автор - krosav4ig
Дата добавления - 17.04.2014 в 18:13
krosav4ig Дата: Воскресенье, 20.04.2014, 17:43 | Сообщение № 22 | Тема: Создать функцию из двух других или болле
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
чето как я ни крутил, у меня ноль не получился
К сообщению приложен файл: 123123.xlsx (10.8 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениечето как я ни крутил, у меня ноль не получился

Автор - krosav4ig
Дата добавления - 20.04.2014 в 17:43
krosav4ig Дата: Вторник, 22.04.2014, 18:22 | Сообщение № 23 | Тема: преобразование строки в числовой эквивалент
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
как-то так [vba]
Код
Public Sub numbers()
With ActiveSheet.UsedRange
        For Each oCell In .Range("A:A,C:K,N:O")
            If oCell <> "" And Val(oCell) <> 0 Then
                oCell.Formula = Val(oCell)
            End If
        Next
End With
End Sub
[/vba]

если в таблицу будут добавляться столбцы справа, которые нужно будет обработать, то можно вместо

[vba]
Код
For Each oCell In .Range("A:A,C:K,N:O")
[/vba]
написать
[vba]
Код
For Each oCell In .Range("A:A,C:K,N:" & _
           Split(Columns(.Column + .Columns.Count - 1).Address(False, False), ":")(0))
[/vba]

чтобы ускорить работу макроса можно ограничить диапазон, указав количество обрабатываемых строк, но этот способ работает только с непрерывными диапазонами, из-за этого приходится добавлять еще один цикл
[vba]
Код
Public Sub numbers()
With ActiveSheet.UsedRange
     For Each Rng In Array("A:A", "C:K", "N:O")
         For Each ocell In .Range(Rng).Rows(.Row & ":" & .Row + .Rows.Count - 1).Cells
             If ocell <> "" And Val(ocell) <> 0 Then
                 ocell.Formula = Val(ocell)
             End If
         Next
     Next
End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 23.04.2014, 17:10
 
Ответить
Сообщениекак-то так [vba]
Код
Public Sub numbers()
With ActiveSheet.UsedRange
        For Each oCell In .Range("A:A,C:K,N:O")
            If oCell <> "" And Val(oCell) <> 0 Then
                oCell.Formula = Val(oCell)
            End If
        Next
End With
End Sub
[/vba]

если в таблицу будут добавляться столбцы справа, которые нужно будет обработать, то можно вместо

[vba]
Код
For Each oCell In .Range("A:A,C:K,N:O")
[/vba]
написать
[vba]
Код
For Each oCell In .Range("A:A,C:K,N:" & _
           Split(Columns(.Column + .Columns.Count - 1).Address(False, False), ":")(0))
[/vba]

чтобы ускорить работу макроса можно ограничить диапазон, указав количество обрабатываемых строк, но этот способ работает только с непрерывными диапазонами, из-за этого приходится добавлять еще один цикл
[vba]
Код
Public Sub numbers()
With ActiveSheet.UsedRange
     For Each Rng In Array("A:A", "C:K", "N:O")
         For Each ocell In .Range(Rng).Rows(.Row & ":" & .Row + .Rows.Count - 1).Cells
             If ocell <> "" And Val(ocell) <> 0 Then
                 ocell.Formula = Val(ocell)
             End If
         Next
     Next
End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 22.04.2014 в 18:22
krosav4ig Дата: Среда, 23.04.2014, 12:29 | Сообщение № 24 | Тема: ТОРГ-2
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
ИМХО, этот вопрос по части VBA.


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 23.04.2014, 12:32
 
Ответить
СообщениеИМХО, этот вопрос по части VBA.

Автор - krosav4ig
Дата добавления - 23.04.2014 в 12:29
krosav4ig Дата: Пятница, 25.04.2014, 20:24 | Сообщение № 25 | Тема: Ограничить движение курсора мыши, хук на мышь
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Вообщем задача такая: ограничить движение курсора при нажатии левой кнопкой мыши на определенном диапазоне границами этого диапазона. Все, что я смог сделать- это написать код для правой кнопки мыши. В примере диапазоны, в которых должен "запираться" курсор выделены зеленым цветом. Все уперлось в хук. Нужно чтобы при нажатии левой кнопки движение курсора ограничивалось границами соответствующего диапазона и при отпускании левой кнопки ограничение снималось.
К сообщению приложен файл: 4636463.xlsm (25.3 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеВообщем задача такая: ограничить движение курсора при нажатии левой кнопкой мыши на определенном диапазоне границами этого диапазона. Все, что я смог сделать- это написать код для правой кнопки мыши. В примере диапазоны, в которых должен "запираться" курсор выделены зеленым цветом. Все уперлось в хук. Нужно чтобы при нажатии левой кнопки движение курсора ограничивалось границами соответствующего диапазона и при отпускании левой кнопки ограничение снималось.

Автор - krosav4ig
Дата добавления - 25.04.2014 в 20:24
krosav4ig Дата: Воскресенье, 27.04.2014, 02:43 | Сообщение № 26 | Тема: Ограничить движение курсора мыши, хук на мышь
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Нашел у себя в закромах библиотеку хука, написанную на delphi

[vba]
Код
library LowLevelMouseHook;

uses
       Windows,
       Messages;

const
       WH_MOUSE_LL = 14;
       MMFName: PChar = 'MMF';

type
       PGlobalDLLData = ^TGlobalDLLData;
       TGlobalDLLData = packed record
         WndHook: HWND;
         Wnd: HWND;
       end;

type
      TMouseHookFilters = record
        BlockMouseMove: boolean;
        BlockLeftButton: boolean;
        BlockRightButton: boolean;
        BlockMiddleButton: boolean;
        BlockWheel: boolean;
        end;

var
       GlobalData: PGlobalDLLData;
       MMFHandle: THandle;
       Filters: TMouseHookFilters;
       MWM_LBUTTONDOWN: Cardinal;
       MWM_LBUTTONUP: Cardinal;

function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
       if (Code = HC_ACTION) then
       begin
         if (wParam =  WM_LBUTTONDOWN) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end else
         if (wParam =  WM_LBUTTONUP) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end
         else
           Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
       end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
       Result := False;
       if State = True then
       begin
         GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
         GlobalData^.Wnd := Wnd;
         if GlobalData^.WndHook <> 0 then
           Result := True;
       end
       else
       begin
         UnhookWindowsHookEx(GlobalData^.WndHook);
         Result := False;
       end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
       UnhookWindowsHookEx(GlobalData^.WndHook);
       if GlobalData^.WndHook = 0 then
         Result := False
       else
        Result := True;
end;

function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
       Filters := HookFilters;
end;

procedure OpenGlobalData();
begin
       MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
       MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
       MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
       GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
       if GlobalData = nil then
         CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
       UnmapViewOfFile(GlobalData);
       CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWORD);
begin
       case Reason of
         DLL_PROCESS_ATTACH: OpenGlobalData;
         DLL_PROCESS_DETACH: CloseGlobalData;
       end;
end;

exports StartMouseHook, StopMouseHook, UpdateMouseHook;

begin
       DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
[/vba]

в самой программе в коде формы в разделе initialization
[vba]
Код

MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
[/vba]

ловушка ставилась вызовом функи
[vba]
Код
     if StartMouseHook(true, Handle) = true then
              HookEnable := true;
[/vba]

и обработчик нажатия
[vba]
Код
procedure TForm1.WndProc(var Msg: TMessage)
{ отслеживаем нажатия левой кл. мыши } ;
begin
       inherited;
       if (Msg.Msg = MWM_LBUTTONDOWN{MWM_LBUTTONUP}) then
       begin
       ShowMessage('DOWN'{'UP'})
       end;
end;
[/vba]

можно ли это как-нить прикрутить к VBA?
К сообщению приложен файл: llmh.zip (16.1 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 27.04.2014, 02:59
 
Ответить
СообщениеНашел у себя в закромах библиотеку хука, написанную на delphi

[vba]
Код
library LowLevelMouseHook;

uses
       Windows,
       Messages;

const
       WH_MOUSE_LL = 14;
       MMFName: PChar = 'MMF';

type
       PGlobalDLLData = ^TGlobalDLLData;
       TGlobalDLLData = packed record
         WndHook: HWND;
         Wnd: HWND;
       end;

type
      TMouseHookFilters = record
        BlockMouseMove: boolean;
        BlockLeftButton: boolean;
        BlockRightButton: boolean;
        BlockMiddleButton: boolean;
        BlockWheel: boolean;
        end;

var
       GlobalData: PGlobalDLLData;
       MMFHandle: THandle;
       Filters: TMouseHookFilters;
       MWM_LBUTTONDOWN: Cardinal;
       MWM_LBUTTONUP: Cardinal;

function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
       if (Code = HC_ACTION) then
       begin
         if (wParam =  WM_LBUTTONDOWN) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end else
         if (wParam =  WM_LBUTTONUP) then
         begin
           SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
           if Filters.BlockLeftButton = True then
             Result := - 1
           else
             Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
         end
         else
           Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
       end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
       Result := False;
       if State = True then
       begin
         GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
         GlobalData^.Wnd := Wnd;
         if GlobalData^.WndHook <> 0 then
           Result := True;
       end
       else
       begin
         UnhookWindowsHookEx(GlobalData^.WndHook);
         Result := False;
       end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
       UnhookWindowsHookEx(GlobalData^.WndHook);
       if GlobalData^.WndHook = 0 then
         Result := False
       else
        Result := True;
end;

function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
       Filters := HookFilters;
end;

procedure OpenGlobalData();
begin
       MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
       MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
       MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
       GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
       if GlobalData = nil then
         CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
       UnmapViewOfFile(GlobalData);
       CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWORD);
begin
       case Reason of
         DLL_PROCESS_ATTACH: OpenGlobalData;
         DLL_PROCESS_DETACH: CloseGlobalData;
       end;
end;

exports StartMouseHook, StopMouseHook, UpdateMouseHook;

begin
       DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
[/vba]

в самой программе в коде формы в разделе initialization
[vba]
Код

MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
[/vba]

ловушка ставилась вызовом функи
[vba]
Код
     if StartMouseHook(true, Handle) = true then
              HookEnable := true;
[/vba]

и обработчик нажатия
[vba]
Код
procedure TForm1.WndProc(var Msg: TMessage)
{ отслеживаем нажатия левой кл. мыши } ;
begin
       inherited;
       if (Msg.Msg = MWM_LBUTTONDOWN{MWM_LBUTTONUP}) then
       begin
       ShowMessage('DOWN'{'UP'})
       end;
end;
[/vba]

можно ли это как-нить прикрутить к VBA?

Автор - krosav4ig
Дата добавления - 27.04.2014 в 02:43
krosav4ig Дата: Понедельник, 28.04.2014, 03:50 | Сообщение № 27 | Тема: Создание таблицы по заданным параметрам
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Вот как вариант с использованием листа-шаблона
К сообщению приложен файл: -demo3-1.xlsm (35.7 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 28.04.2014, 03:57
 
Ответить
СообщениеВот как вариант с использованием листа-шаблона

Автор - krosav4ig
Дата добавления - 28.04.2014 в 03:50
krosav4ig Дата: Вторник, 29.04.2014, 01:32 | Сообщение № 28 | Тема: Создание таблицы по заданным параметрам
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
В моем файле как раз это и реализовано. В макросе qwe() lek это количество часов лекций, lab это количество часов лабораторных, stud это количество студентов. При запуске этого макроса лист шаблон копируется и в скопированном листе таблицы подгоняются под заданные параметры. Запустить его можно с вкладки разработчик, посмотреть код макроса можно нажав alt+f11, все макросы в моем файле находятся в module1 в разделе modules.
[p.s.]если на ленте нет вкладки разработчик, то как ее включить можно почитать тут


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Вторник, 29.04.2014, 13:55
 
Ответить
СообщениеВ моем файле как раз это и реализовано. В макросе qwe() lek это количество часов лекций, lab это количество часов лабораторных, stud это количество студентов. При запуске этого макроса лист шаблон копируется и в скопированном листе таблицы подгоняются под заданные параметры. Запустить его можно с вкладки разработчик, посмотреть код макроса можно нажав alt+f11, все макросы в моем файле находятся в module1 в разделе modules.
[p.s.]если на ленте нет вкладки разработчик, то как ее включить можно почитать тут

Автор - krosav4ig
Дата добавления - 29.04.2014 в 01:32
krosav4ig Дата: Среда, 30.04.2014, 01:05 | Сообщение № 29 | Тема: Создание таблицы по заданным параметрам
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Ну вот как-то так.
[p.s.]я там со скуки немного поигрался с условным форматированием и галочками на первом листе :)
К сообщению приложен файл: demo3-3.xlsm (62.8 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеНу вот как-то так.
[p.s.]я там со скуки немного поигрался с условным форматированием и галочками на первом листе :)

Автор - krosav4ig
Дата добавления - 30.04.2014 в 01:05
krosav4ig Дата: Среда, 30.04.2014, 18:49 | Сообщение № 30 | Тема: Скролл пустых строк вплоть до 65556 строки - как убрать?
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
А удалял делитом или удалением строки?


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеА удалял делитом или удалением строки?

Автор - krosav4ig
Дата добавления - 30.04.2014 в 18:49
krosav4ig Дата: Воскресенье, 04.05.2014, 04:42 | Сообщение № 31 | Тема: Запрет выбора аналогичных значений в последовательном списк
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
проблема №1 вариант с дополнительными столбцами

в ячейку M85 поставить два пробела
в диапазоне N76:N85 формула
Код
{=СТРОКА()-ЕСЛИ(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));"");$M$76:$M$85)<>"";75;65)}

в диапазоне O76:O85 формула
Код
{=ТЕКСТ(ИНДЕКС(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));"");$M$76:$M$85); ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); СТРОКА($A:$A)); СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); 0));"")}

создать именованный диапазон с именем List и диапазоном
Код
=СМЕЩ($O$76:$O$86;0;0;еслиошибка(ПОИСКПОЗ(" ";$O$76:$O$86;0);ПОИСКПОЗ("  ";$O$76:$O$86;0));1)

в процедуре MannagerList заменить [vba]
Код
Formula1:="=$M$76:$M$85"
[/vba] на [vba]
Код
Formula1:="=List"
[/vba]

Проблема №2

в макросе перед строкой [vba]
Код
A1 = "Organization and planning"
[/vba]
добавить строку [vba]
Код
ActiveSheet.Unprotect
[/vba]
и после строки [vba]
Код
Range("C6").Select
[/vba]
добавить строку [vba]
Код
ActiveSheet.Protect
[/vba]

ЗЫ

в процедуре Workbook_SheetChange я бы посоветовал заменить [vba]
Код
Select Case CStr(target)
          Case "_": MannagerList (-1)
          Case "Manager": MannagerList (1)
          Case "Manual_Worker", "Professional": MannagerList (0)
End Select
[/vba] на
[vba]
Код
If Not Intersect(target, Range("H4:I5")) Is Nothing Then
       Select Case CStr(target)
              Case "_": MannagerList (-1)
              Case "Manager": MannagerList (1)
              Case "Manual_Worker", "Professional": MannagerList (0)
       End Select
End If
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 04.05.2014, 04:46
 
Ответить
Сообщениепроблема №1 вариант с дополнительными столбцами

в ячейку M85 поставить два пробела
в диапазоне N76:N85 формула
Код
{=СТРОКА()-ЕСЛИ(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));"");$M$76:$M$85)<>"";75;65)}

в диапазоне O76:O85 формула
Код
{=ТЕКСТ(ИНДЕКС(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));"");$M$76:$M$85); ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); СТРОКА($A:$A)); СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); 0));"")}

создать именованный диапазон с именем List и диапазоном
Код
=СМЕЩ($O$76:$O$86;0;0;еслиошибка(ПОИСКПОЗ(" ";$O$76:$O$86;0);ПОИСКПОЗ("  ";$O$76:$O$86;0));1)

в процедуре MannagerList заменить [vba]
Код
Formula1:="=$M$76:$M$85"
[/vba] на [vba]
Код
Formula1:="=List"
[/vba]

Проблема №2

в макросе перед строкой [vba]
Код
A1 = "Organization and planning"
[/vba]
добавить строку [vba]
Код
ActiveSheet.Unprotect
[/vba]
и после строки [vba]
Код
Range("C6").Select
[/vba]
добавить строку [vba]
Код
ActiveSheet.Protect
[/vba]

ЗЫ

в процедуре Workbook_SheetChange я бы посоветовал заменить [vba]
Код
Select Case CStr(target)
          Case "_": MannagerList (-1)
          Case "Manager": MannagerList (1)
          Case "Manual_Worker", "Professional": MannagerList (0)
End Select
[/vba] на
[vba]
Код
If Not Intersect(target, Range("H4:I5")) Is Nothing Then
       Select Case CStr(target)
              Case "_": MannagerList (-1)
              Case "Manager": MannagerList (1)
              Case "Manual_Worker", "Professional": MannagerList (0)
       End Select
End If
[/vba]

Автор - krosav4ig
Дата добавления - 04.05.2014 в 04:42
krosav4ig Дата: Воскресенье, 04.05.2014, 04:43 | Сообщение № 32 | Тема: Запрет выбора аналогичных значений в последовательном списк
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
да и весь код процедуры MannagerList я бы переписал как-то так
[vba]
Код
Sub MannagerList(Mang As Integer)
      Dim AA As Variant
      ActiveSheet.Unprotect
      AA = Array("Organization and planning", "Decision-making", _
          "Team building, management And development", "Delegation and control", _
          "Leadership and motivation", "Strategic thinking")
' "Manual_Worker", "Professional":
      If Mang = 0 Then
          Range("E39:E45").Value = " "
          ' Range("E46").Value = " "
          Range("B39").Value = "Professional Competencies"
          Range("D42:I44").RowHeight = 0
          'Range("D44:I46").Select
          'Range("D44:I46").Select
          ' Selection.RowHeight = 0
      ' Уставновка
          With Range("E39:E44").Validation
             .Delete
             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                 Operator:=xlBetween, Formula1:="=List"
         End With
      'Установка в начало
          Range("E40").Select
          Range("D39").Value = 1
          Range("D40").Value = 2
          Range("D41").Value = 3
      ElseIf Mang = 1 Then
' Manager
          For i = 0 To 5
              Range("E" & 39 + i).Value = AA(i)
          Next
      'Range("E46").Value = A7
          Range("B39").Value = "Managerial Competencies"
      ' Высота строк
          Range("D40:I46").RowHeight = 14
      ' Очистка данных проверки
          With Range("E39:E46").Validation
              .Delete
              .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _
                  Operator:=xlBetween
          End With
      ' Установка в текущее положение
          Range("E40").Select
          For i = 1 To 6
              Range("D" & 38 + i).Value = i
          Next
      ElseIf Mang = -1 Then
' *************************************************************************
' Пустое значение
' *************************************************************************
          Range("B39").Value = ""
          Range("D39:D44").Value = ""
          Range("E39:E44").Value = ""
      End If
' Следующее поле для заполнения после выбора типа
       Range("C6").Select
       ActiveSheet.Protect
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 04.05.2014, 04:55
 
Ответить
Сообщениеда и весь код процедуры MannagerList я бы переписал как-то так
[vba]
Код
Sub MannagerList(Mang As Integer)
      Dim AA As Variant
      ActiveSheet.Unprotect
      AA = Array("Organization and planning", "Decision-making", _
          "Team building, management And development", "Delegation and control", _
          "Leadership and motivation", "Strategic thinking")
' "Manual_Worker", "Professional":
      If Mang = 0 Then
          Range("E39:E45").Value = " "
          ' Range("E46").Value = " "
          Range("B39").Value = "Professional Competencies"
          Range("D42:I44").RowHeight = 0
          'Range("D44:I46").Select
          'Range("D44:I46").Select
          ' Selection.RowHeight = 0
      ' Уставновка
          With Range("E39:E44").Validation
             .Delete
             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                 Operator:=xlBetween, Formula1:="=List"
         End With
      'Установка в начало
          Range("E40").Select
          Range("D39").Value = 1
          Range("D40").Value = 2
          Range("D41").Value = 3
      ElseIf Mang = 1 Then
' Manager
          For i = 0 To 5
              Range("E" & 39 + i).Value = AA(i)
          Next
      'Range("E46").Value = A7
          Range("B39").Value = "Managerial Competencies"
      ' Высота строк
          Range("D40:I46").RowHeight = 14
      ' Очистка данных проверки
          With Range("E39:E46").Validation
              .Delete
              .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, _
                  Operator:=xlBetween
          End With
      ' Установка в текущее положение
          Range("E40").Select
          For i = 1 To 6
              Range("D" & 38 + i).Value = i
          Next
      ElseIf Mang = -1 Then
' *************************************************************************
' Пустое значение
' *************************************************************************
          Range("B39").Value = ""
          Range("D39:D44").Value = ""
          Range("E39:E44").Value = ""
      End If
' Следующее поле для заполнения после выбора типа
       Range("C6").Select
       ActiveSheet.Protect
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 04.05.2014 в 04:43
krosav4ig Дата: Понедельник, 05.05.2014, 19:11 | Сообщение № 33 | Тема: Заливка ячеек по двойному клику
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
а можно так?

[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      colors = Array(vbWhite, vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan, vbWhite)
      Cancel = True
      With Target.Interior
          For i = 0 To UBound(colors)
              If .Color = colors(i) Then
                  .Color = colors(i + 1)
                  Exit For
              ElseIf i = UBound(colors) Then .Color = colors(0)
              End If
          Next
      End With
End Sub
[/vba]

и так

[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Words = Array("Рыба", "Кот", "Сметана", "Рыба")
      Cancel = True
      With Target
          For i = 0 To UBound(Words)
              If .Value = Words(i) Then
                  .Value = Words(i + 1)
                  Exit For
              ElseIf i = UBound(Words) Then .Value = Words(1)
              End If
          Next
      End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 05.05.2014, 19:11
 
Ответить
Сообщениеа можно так?

[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      colors = Array(vbWhite, vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan, vbWhite)
      Cancel = True
      With Target.Interior
          For i = 0 To UBound(colors)
              If .Color = colors(i) Then
                  .Color = colors(i + 1)
                  Exit For
              ElseIf i = UBound(colors) Then .Color = colors(0)
              End If
          Next
      End With
End Sub
[/vba]

и так

[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Words = Array("Рыба", "Кот", "Сметана", "Рыба")
      Cancel = True
      With Target
          For i = 0 To UBound(Words)
              If .Value = Words(i) Then
                  .Value = Words(i + 1)
                  Exit For
              ElseIf i = UBound(Words) Then .Value = Words(1)
              End If
          Next
      End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 05.05.2014 в 19:11
krosav4ig Дата: Вторник, 06.05.2014, 15:47 | Сообщение № 34 | Тема: Заливка ячеек по двойному клику
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Alex_ST, о том самом :)
Просто я исходя из уровня владения VBA топик-стартера решил все-таки написать пример реализации предложенного вами алгоритма, к тому же при использовании цикла в решении этой задачи есть пара нюансов, которые могут ввести в ступор новичка в программировании. В данном случае это невозможность использования обычного Else и необходимость выхода из цикла при срабатывании условия. Ну вот как-то так :) .

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


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеAlex_ST, о том самом :)
Просто я исходя из уровня владения VBA топик-стартера решил все-таки написать пример реализации предложенного вами алгоритма, к тому же при использовании цикла в решении этой задачи есть пара нюансов, которые могут ввести в ступор новичка в программировании. В данном случае это невозможность использования обычного Else и необходимость выхода из цикла при срабатывании условия. Ну вот как-то так :) .

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

Автор - krosav4ig
Дата добавления - 06.05.2014 в 15:47
krosav4ig Дата: Воскресенье, 11.05.2014, 02:46 | Сообщение № 35 | Тема: Запрет выбора аналогичных значений в последовательном списк
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Написанные мной формулы - формулы массива. Чтобы их ввести, нужно выделить диапазон, в строку формул ввести фомулу без фигурных скобок и нажать ctrl±shift+enter


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеНаписанные мной формулы - формулы массива. Чтобы их ввести, нужно выделить диапазон, в строку формул ввести фомулу без фигурных скобок и нажать ctrl±shift+enter

Автор - krosav4ig
Дата добавления - 11.05.2014 в 02:46
krosav4ig Дата: Понедельник, 12.05.2014, 02:45 | Сообщение № 36 | Тема: Запрет выбора аналогичных значений в последовательном списк
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
небольшая поправка: в диапазоне O76:O85 формулу нужно заменить на
Код
=ТЕКСТ(ИНДЕКС(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));" ");$M$76:$M$85); ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); СТРОКА($A:$A)); СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); 0));"")

Serge_007, скажите пожалуйста можно ли эти первые две формулы объединить в одну?

Graceless, ради интереса заглянул в ваш макрос...
у меня возникли большие сомнения по поводу строки
[vba]
Код
If Target.Count > 1 Then Target.Delete
[/vba]
чтобы было понятнее переведу ее на руссий язык
[vba]
Код
ЕСЛИ в выделенном диапазоне более 1 ячейки ТО удалить первую ячейку выделенного диапазона со сдвигом влево
[/vba]
дело в том, что в Range("E39:G41") все ячейки являются частью объединенного диапазона и привыборе любой из них на этой строке кода будет происходить удаление

заглянул в module1 и мне стало как-то непосебе :)
настоятельно рекомендую все что там написано заменить на чтото типа этого
[vba]
Код
Sub Clear_all()
      ActiveSheet.Unprotect
      Application.ScreenUpdating = False
          Dim rngs As Variant
          Dim rng, rng2 As Range
          rngs = Array("B39", "C4", "H4", "C6", "C7", "C8", "C9", "C10", "C12", _
              "C13", "H12", "H8", "C17", "E17:H19", "C21", "E21:H23", "C25", "E25:H31", _
              "C39", "E39:H44", "D49:D54", "D56:D58", "B62:E62", "B63:E63", "B66:E66", _
              "B67:E67", "H33:H37", "F62:I62", "F67:I67", "D64:E64", "D68:E68", "H64:I64", _
              "C2")
          Set rng = Range(rngs(0))
          Dim i As Integer
          For i = 0 To UBound(rngs)
              For Each cell In Range(rngs(i))
                  If cell.MergeCells Then
                      Set rng = Union(rng, cell.MergeArea)
                  Else
                      Set rng = Union(rng, cell)
                  End If
              Next
          Next
          rng.ClearContents
      Application.ScreenUpdating = True
      ActiveSheet.Protect
End Sub
[/vba]

и еще несколько слов про использование Worksheet_Change, Workbook_SheetChange, Worksheet_SelectionChange, Workbook_SheetSelectionChange

Worksheet_Change, Workbook_SheetChange - это процедуры, которые выполняются при любом изменении ячеек листа. Worksheet_Change запускается только при изменении на листе, в модуль которого она прописана, если она прописана не в модуль листа, оно работать не будет. Workbook_SheetChange запускается при изменениии на любом листе и эта процедура должна быть прописана в модуль книги (в вашем случае ЦяКнига). Если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.

та же картина и с Worksheet_SelectionChange, Workbook_SheetSelectionChange
Worksheet_SelectionChange запускается при изменении адреса активной ячейки в том листе, в модуль которого она прописана. Workbook_SheetSelectionChange запускается при изменении адреса активной ячейки в любом листе и точно так же как и Workbook_SheetChange должна быть прописана в модуль книги (в вашем случае ЦяКнига). И так же если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.
К сообщению приложен файл: 8454538.xlsm (43.8 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 12.05.2014, 02:48
 
Ответить
Сообщениенебольшая поправка: в диапазоне O76:O85 формулу нужно заменить на
Код
=ТЕКСТ(ИНДЕКС(ЕСЛИОШИБКА(ПОДСТАВИТЬ($M$76:$M$85;ИНДЕКС($E$39:$E$44;ПОИСКПОЗ($M$76:$M$85;$E$39:$E$44;0));" ");$M$76:$M$85); ПОИСКПОЗ(НАИМЕНЬШИЙ(СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); СТРОКА($A:$A)); СЧЁТЕСЛИ($N$76:$N$85; "<"&$N$76:$N$85); 0));"")

Serge_007, скажите пожалуйста можно ли эти первые две формулы объединить в одну?

Graceless, ради интереса заглянул в ваш макрос...
у меня возникли большие сомнения по поводу строки
[vba]
Код
If Target.Count > 1 Then Target.Delete
[/vba]
чтобы было понятнее переведу ее на руссий язык
[vba]
Код
ЕСЛИ в выделенном диапазоне более 1 ячейки ТО удалить первую ячейку выделенного диапазона со сдвигом влево
[/vba]
дело в том, что в Range("E39:G41") все ячейки являются частью объединенного диапазона и привыборе любой из них на этой строке кода будет происходить удаление

заглянул в module1 и мне стало как-то непосебе :)
настоятельно рекомендую все что там написано заменить на чтото типа этого
[vba]
Код
Sub Clear_all()
      ActiveSheet.Unprotect
      Application.ScreenUpdating = False
          Dim rngs As Variant
          Dim rng, rng2 As Range
          rngs = Array("B39", "C4", "H4", "C6", "C7", "C8", "C9", "C10", "C12", _
              "C13", "H12", "H8", "C17", "E17:H19", "C21", "E21:H23", "C25", "E25:H31", _
              "C39", "E39:H44", "D49:D54", "D56:D58", "B62:E62", "B63:E63", "B66:E66", _
              "B67:E67", "H33:H37", "F62:I62", "F67:I67", "D64:E64", "D68:E68", "H64:I64", _
              "C2")
          Set rng = Range(rngs(0))
          Dim i As Integer
          For i = 0 To UBound(rngs)
              For Each cell In Range(rngs(i))
                  If cell.MergeCells Then
                      Set rng = Union(rng, cell.MergeArea)
                  Else
                      Set rng = Union(rng, cell)
                  End If
              Next
          Next
          rng.ClearContents
      Application.ScreenUpdating = True
      ActiveSheet.Protect
End Sub
[/vba]

и еще несколько слов про использование Worksheet_Change, Workbook_SheetChange, Worksheet_SelectionChange, Workbook_SheetSelectionChange

Worksheet_Change, Workbook_SheetChange - это процедуры, которые выполняются при любом изменении ячеек листа. Worksheet_Change запускается только при изменении на листе, в модуль которого она прописана, если она прописана не в модуль листа, оно работать не будет. Workbook_SheetChange запускается при изменениии на любом листе и эта процедура должна быть прописана в модуль книги (в вашем случае ЦяКнига). Если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.

та же картина и с Worksheet_SelectionChange, Workbook_SheetSelectionChange
Worksheet_SelectionChange запускается при изменении адреса активной ячейки в том листе, в модуль которого она прописана. Workbook_SheetSelectionChange запускается при изменении адреса активной ячейки в любом листе и точно так же как и Workbook_SheetChange должна быть прописана в модуль книги (в вашем случае ЦяКнига). И так же если не планируется, что в книге будет множество однотипных листов, то я бы посоветовал перенести эту процедуру в модуль листа.

Автор - krosav4ig
Дата добавления - 12.05.2014 в 02:45
krosav4ig Дата: Понедельник, 12.05.2014, 04:14 | Сообщение № 37 | Тема: Быстрый подсчет количества и сумм
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
как-то так
К сообщению приложен файл: 1791639.xlsx (11.3 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 12.05.2014, 05:05
 
Ответить
Сообщениекак-то так

Автор - krosav4ig
Дата добавления - 12.05.2014 в 04:14
krosav4ig Дата: Понедельник, 12.05.2014, 04:43 | Сообщение № 38 | Тема: Условное форматирование выходных дней
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Shylo, Какое ПО стоит у вас на планшете, какая ось


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеShylo, Какое ПО стоит у вас на планшете, какая ось

Автор - krosav4ig
Дата добавления - 12.05.2014 в 04:43
krosav4ig Дата: Понедельник, 12.05.2014, 11:14 | Сообщение № 39 | Тема: Условное форматирование выходных дней
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Ну дык ставьте kingsoft office и будет вам счастье. :) Kingsoft office free(google play) англ. условное форматирование в нем вполне себе нормально работает. Если нужна русская версия, то выбирайте тут. А про VBA на Android пока остается только мечтать.


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеНу дык ставьте kingsoft office и будет вам счастье. :) Kingsoft office free(google play) англ. условное форматирование в нем вполне себе нормально работает. Если нужна русская версия, то выбирайте тут. А про VBA на Android пока остается только мечтать.

Автор - krosav4ig
Дата добавления - 12.05.2014 в 11:14
krosav4ig Дата: Понедельник, 12.05.2014, 18:57 | Сообщение № 40 | Тема: Удалить строки по условию если в ячейке 0
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
[vba]
Код
Private Sub del_0()
      Dim rng As Range
      With ThisWorkbook.Worksheets("день").Range("C:C")
          Set rng = .Find(0, , LookIn:=xlValues, lookat:=xlWhole)
          If Not rng Is Nothing Then
              Do
                  rng.EntireRow.Delete
                  Set rng = .FindNext()
              Loop While Not rng Is Nothing
          End If
      End With
End Sub
[/vba]
К сообщению приложен файл: 3948024.xlsm (16.6 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Понедельник, 12.05.2014, 18:58
 
Ответить
Сообщение[vba]
Код
Private Sub del_0()
      Dim rng As Range
      With ThisWorkbook.Worksheets("день").Range("C:C")
          Set rng = .Find(0, , LookIn:=xlValues, lookat:=xlWhole)
          If Not rng Is Nothing Then
              Do
                  rng.EntireRow.Delete
                  Set rng = .FindNext()
              Loop While Not rng Is Nothing
          End If
      End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 12.05.2014 в 18:57
Мир MS Excel » Записи участника » krosav4ig [2347]
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!