Вопрос Excel - анализ спинов на рулетке казино

3 года 10 мес. назад - 3 года 10 мес. назад #1 от Mira
Любые генерации чисел можно анализировать в Excel. Кроме стандартных функций ПОИСКПОЗ, ИНДЕКС, ВПР для глубоких исследований нужно научиться работать с макросами.
В этой теме будем учиться понимать файлы alt2005 и делать разные исследования.

Чтобы начать работу с макросами первым шагом включим вкладку "Разработчик".

На вкладке Файл выберите Параметры> Настройка ленты.

В разделе Настройка ленты в списке Основные вкладки установите флажок "Разработчик".



После того как вы отобразите вкладку, вкладка "Разработчик" останется видимой, если не снять флажок или переустановить приложение Microsoft Office.
Вложения:
Спасибо сказали: Jokk Ma

3 года 10 мес. назад - 3 года 10 мес. назад #2 от Mira
Теперь можно посмотреть макросы, в которых alt2005 описал специальные функции. Без навыков программирования Visual Basic не обойтись. Но если хотим получать нужные функции для Excel, то придется разобраться

Public Function getResult(z As Range, distance As Long, repeats As Long, Optional w = 0) As Variant
 Dim i As Long
 Dim bottomAdres As Long
 Dim za As Long
 Dim counter As Long
 Dim sum As Long
 Dim umsatz As Long
 Dim num As Long
 Dim ss As String
 Dim d As Long
 
 bottomAdres = z.Row - distance + 1
 If bottomAdres < 1 Then
  getResult = 0
  Exit Function
 End If
 counter = 1
 d = 0
 For i = z.Row - 1 To bottomAdres Step -1
   d = d + 1
   za = Worksheets(z.Worksheet.Name).Cells(i, 1)
   If za = z.Value Then
     counter = counter + 1
   End If
   If counter = repeats Then
     Exit For
   End If
 Next i
 If counter < repeats Then
   getResult = 0
   Exit Function
 End If
 For i = z.Row + 1 To z.Row + distance
   umsatz = umsatz + 1
   za = Worksheets(z.Worksheet.Name).Cells(i, 1)
   If za = z.Value Then
     sum = sum + 35
     If w = 0 Then
      getResult = sum
     End If
     If w = 1 Then
      getResult = umsatz
     End If
     If w = 2 Then
      getResult = i
     End If
     Exit Function
   Else
     sum = sum - 1
   End If
 Next i
 getResult = sum
 If w = 1 Then
  getResult = umsatz
 End If
End Function


Public Function getNextZ(z As Range, za As Long, Optional w = 0) As Variant
 Dim bottom As Long
 Dim i As Long
 Dim valu As Variant
 Dim cou As Long
 Dim startVal As Long
 Dim zc As Long
 
 startVal = z.Value
 For i = z.Row + 1 To z.Row + 600
  cou = cou + 1
  zc = Worksheets(z.Worksheet.Name).Cells(i, z.Column)
  If zc = za Then
   If w = 0 Then
    getNextZ = cou
   End If
   If w = 1 Then
    getNextZ = i
   End If
   Exit Function
  End If
 Next i
 getNextZ = 0
End Function


Public Function getPredZ(z As Range, za As Long, Optional w = 0) As Variant
 Dim bottom As Long
 Dim i As Long
 Dim valu As Variant
 Dim cou As Long
 Dim startVal As Long
 Dim zc As Long
 
 startVal = z.Value
 bottom = z.Row - 600
 If bottom < 1 Then
  bottom = 1
 End If
 For i = z.Row - 1 To bottom Step -1
  cou = cou + 1
  zc = Worksheets(z.Worksheet.Name).Cells(i, z.Column)
  If zc = startVal Then
   If w = 0 Then
    getPredZ = cou
   End If
   If w = 1 Then
    getPredZ = i
   End If
   Exit Function
  End If
 Next i
 getPredZ = 0
End Function
Спасибо сказали: Jokk Ma

3 года 10 мес. назад #3 от Mira
Кpаткий спpавочник операторов VB.

Abs (функция)
 - возвращает абсолютное значение числа
And (операция) - логическое И
AppActivate (оператор) - активизирует окно приложения
Array (функция) - создает массив из параметров и возвращает его как переменную типа Variant
Asc (функция) - возвращает числовой код первого символа строки аргумента
Atn (функция) - возвращает арктангенс числа в радианах
Веер (оператор) - проигрывает звуковой сигнал через динамик компьютера
Call (оператор) - передает управление процедуре модуля (Sub), функции модуля (Function) или подпрограмме DLL
CBool (функция) - приводит выражение к типу Boolean
CByte (функция) - преобразует выражение к типу Byte
ССur (функция) - преобразование выражения к типу Currency
CDate (функция) - преобразование выражения к типу Date
CDbl (функция) - преобразование к типу Double
ChDir (оператор) - изменяет текущий каталог на устройстве
ChDrive (оператор) - изменяет текущее устройство
Choose (функция) - возвращает значение из списка аргументов с определенным порядковым номером
Chr (функция) - возвращает символ, связанный с определенным числовым кодом
CInt (функция) - преобразование выражения к типу Integer
CLng (функция) - преобразование выражения к типу Long
Close (оператор) - закрывает файл, открытый оператором Open
Command (функция) - возвращает командную строку, используемую для запуска Visual Basic или приложения VB
Const (оператор) - объявления констант
Cos (функция) - возвращает косинус числа
Create Object (функция) - создать OLE Automation объект
CSng (функция) - преобразование выражения к типу Single
CStr (функция) - преобразование выражения к типу String
CurDir (функция) - возвращает текущий каталог логического устройства
CVar (функция) - преобразование выражения к типу Variant
CVErr (функция) - возвращает подтип ошибки, для определенного пользователемномера ошибки
Date (оператор) - устанавливает значение системной даты
Date (функция) - возвращает значение системной даты
DateAdd (функция) - возвращает переменную типа Variant, содержащую дату, отличающуюся от заданной на определенный интервал времени
DateDiff (функция) - возвращает число временных интервалов между двумя датами
DatePart (функция) - возвращает определенную часть заданной даты
DateSerial (функция) - возвращает дату для заданного года, месяца и дня
DateValue (функция) - возвращает дату
Day (функция) - возвращает число от 1 до 31, соответствующее текущему дню месяца
DDB (функция) - возвращает значение амортизационных потерь за определенный период
Declare (оператор) - на уровне модуля объявляет ссылки ко внешним подпрограммам в DLL
Deftype (операторы) - устанавливает тип данных по умолчанию на уровне модуля для переменных, параметров подпрограмм, а также возвращаемых значений для функций и операторов Property Get, начинающихся с определенных символов
Dim (оператор) - объявляет переменные и выделяет память под них
Dir (функция) - возвращает имя файла или каталог, подходящий для данного шаблона или атрибута файла, или метку тома устройства
DoEvents (функция) - прерывает выполнение приложения
Do... Loop (оператор) - повторяет блок команд до тех пор, пока условие верно или до тех пор, пока условие не станет верным
End (оператор) - заканчивает подпрограмму или блок команд
Environ (функция) - возвращает строку, связанную с переменной окружения операционной системы
EOF (функция) - возвращает значение, указывающее, достигнут ли конец файла
Eqv (оператор) - проверяет логическое равенство двух выражений
Erase (оператор) - повторно инициализирует элементы массивов фиксированного размера и перераспределяет память под динамические массивы
Error (оператор) - эмулирует возникновение ошибки
Error (функция) - возвращает текст сообщения данного номера ошибки
Exit (операторы) - осуществляет выход из циклов Do ... Loop, For... Next, функции и процедур
Ехр (функция) - возвращает экспоненту числа
FileAttr (функция) - возвращает режим открытия или номер (handle) файла
FileCopy(onepamop) - копирует файл
FileDateTime (функция) - возвращает дату и время создания или последней модификации файла
FileLen (функция) - возвращает длину файла в байтах
Fix (функция) - возвращает целую часть числа
For Each...Next (оператор) - повторяет одну и ту же последовательность команд для каждого элемента массива или коллекции
For...Next (оператор) - повторяет последовательность команд определенное число раз
Format (функция) - форматирует выражение в соответствии с заданным форматом
FreeFile (функция) - возвращает следующий не занятый номер файла для использования в операторе Open
Function (оператор) - объявляет имя, аргументы и код подпрограммы,возвращающей значение (функции)
FV (функция) - возвращает значение ренты, основываясь на периодических взносах и постоянной норме капиталовложений
Get (оператор) - читает данные из открытого файла в переменную
GetAttr (функция) - возвращает атрибуты файла, каталога или метки тома
GetObject (функция) - возвращает OLE Automation объект для файла сданным расширением
GoSub... Return (оператор) - выполняет подпрограмму
GoTo (оператор) - передает управление определенной строке подпрограммы без возврата контроля
Hex (функция) - возвращает строку, представляющую шестнадцатеричное значение числа
Hour (функция) - возвращает целое число в диапазоне 0 - 23 включительно,представляющее определенный час дня
If...Then... Else (оператор) - выполнение групп команд в зависимости от значения выражения
Iff (функция) - возвращает одно из двух значении в зависимости от значения выражения
Imp (операция) - импликация двух выражений
Input (функция) - возвращает символы из файла, открытого для последовательного доступа или как двоичный файл
Input # (оператор) - считывает данные из открытого файла в переменные
InputBox (функция) - показывает диалоговое окно ввода, ожидает ввода текста и возвращает содержимое введенного текста, после закрытия окна
InStr (функция) - возвращает позицию первой найденной подстроки в строке
Int (функция) - возвращает целую часть числа
Is (операция) - сравнение двух ссылок на объекты
IsArray (функция) - возвращает булево значение, указывающее, является ли данная переменная массивом
IsDate (функция) - возвращает булево значение, указывающее, может ли выражение быть преобразовано к типу Date
IsEmpty (функция) - возвращает булево значение, указывающее, инициализировано ли значение данной переменной
IsError (функция) - возвращает булево значение, указывающее, является ли выражение значением кода ошибки
IsMissing (функция) - возвращает булево значение, указывающее,был ли передан данный необязательный параметр в подпрограмму
IsNull (функция) - возвращает булево значение, указывающее, не содержит ли выражение недопустимое (Null) значение
IsNumeric (функция) - возвращает булево значение, указывающее,может ли данное выражение рассматриваться как число
IsObject (функция) - возвращает булево значение, указывающее, является ли выражение объектом OLE Automation
Kill (оператор) - удаляет файл
LBound (функция) - возвращает значение нижней границы индекса массива
LCase (функция) - возвращает строку в нижнем регистре
Left (функция) - возвращает определенное число символов с начала строки
Len (функция) - возвращает число символов строки или число байт,необходимых для хранения переменной
Let (оператор) - присваивает значение выражения переменной или свойству
Like (операция) - сравнение двух строк
Line Input # (оператор) - считывает строку из файла в переменную
Load (оператор) - загружает в память форму или элемент управления
LoadPicture (функция) - загружает графический образ в объекты: Form,
Loc (функция) - возвращает текущую позицию чтения/записи в открытом файле
Lock (оператор) - контролирует доступ других процессов ко всему или части открытого файла
LOF (функция) - возвращает размер в байтах открытого файла
Log (функция) - возвращает натуральный логарифм числа
LSet (оператор) - копирует строку в строковую переменную, а также копирует значение переменной одного специализированного типа в переменную другого специализированного типа
LTrim (функция) - возвращает копию строки без лидирующих пробелов
Mid (оператор) - замещает определенное число символов в строке на символы из другой строки
Mid (функция) - возвращает определенное число символов с определенной позиции строки
Minute (функция) - возвращает целое число в диапазоне 0 - 59, представляющее минуту часа
MkDir (оператор) - создает новый каталог
Mod (операция) - возвращает остаток от деления двух чисел
Month (функция) - возвращает целое число в диапазоне 1 - 12, представляющее номер месяца
MsgBox (функция) - показывает сообщение в диалоговом окне, ожидает выбор одной из кнопок пользователем и возвращает значение, указывающее,какая кнопка была выбрана
Name (оператор) - переименовывает файл или каталог
Not (операция) - логическое отрицание
Now (функция) - возвращает текущие значения даты и времени
Oct (функция) - возвращает строку, представляющую восьмеричное представление числа
On Error (оператор) - устанавливает обработчик ошибок и задает местоположение подпрограммы обработки; используется также для отмены обработки ошибок подпрограммой обработчика
Оn..GoSub, On...GoTo (операторы) - передача управления на одну из нескольких определенных строк (меток), в зависимости от значения выражения
Open (оператор) - скрывает файл для ввода/вывода
Option Base (оператор) - используется для объявления значения нижней границы размерности индексов массивов по умолчанию
Option Compare (оператор) - используется на уровне модуля для объявления метода сравнения по умолчанию при сравнении строк
Option Explicit (оператор) - используется на уровне модуля для установки проверки наличия объявлений для всех переменных в данном модуле
Option Private (оператор) - используется на уровне модуля для указания,что весь модуль является Private
Or (операция) - логическое ИЛИ
Partition (функция) - возвращает строку, указывающую, сколько раз встретились числа из заданного диапазона
Print # (оператор) - записывает форматированные данные в файл
Private (оператор) - используется на уровне модуля для объявления Privateпеременных и выделяет место в памяти для их хранения
Property Get (оператор) - объявляет имя, аргументы и код подпрограммы получения значения свойства
Property Let (оператор) - объявляет имя, аргументы и код процедуры установки значения свойства
Property Set (оператор) - объявляет имя, аргументы и код процедуры установки ссылки на объект
Public (оператор) - используется на уровне модуля для объявления Publicпеременных и выделяет место в памяти для их хранения
Put (оператор) - записывает переменную в файл
QBColor (функция) - возвращает RGB код, соответствующий номеру цвета
Randomize (оператор) - инициализирует генератор случайных чисел
RGB (функция) - возвращает целое число, представляющее значение RGBкода
ReDim (оператор) - используется на уровне подпрограммы для переопределения размера динамических массивов и выделения под них места в памяти
Rem (оператор) - вставка комментариев в программу
Reset (оператор) - закрывает все открытые программой файлы
Resume (оператор) - продолжает выполнение программы после завершения процедуры обработчика ошибок
Right (функция) - возвращает определенное число символов с правой стороны строки
RmDir (оператор) - удаляет каталог
Rnd (функция) - возвращает случайное число
RSet (оператор) - копирует правую часть строки в строковую переменную
RTrim (функция) - возвращает копию строки без конечных пробелов
SavePicture (оператор) - сохраняет в файл графический образ объектаForm, элементов управления Picture Box или Image
Second (функция) - возвращает целое значение в диапазоне 0 - 59,представляющее секунду в минуте
Seek (оператор) - устанавливает позицию для следующей операции чтения или записи в открытый файл
Seek (функция) - возвращает текущую позицию чтения/записи открытого файла
Select Case (оператор) - выполняет одну или несколько команд, в зависимости от значения выражения
SendKeys (оператор) - посылает одно или несколько нажатий клавиш активному окну, как если бы они были введены пользователем с клавиатуры
Set (оператор) - связывает ссылку на объект с переменной или свойством
SetAttr (оператор) - устанавливает атрибуты файла
Sgn (функция) - возвращает знак числа
Shell (функция) - запускает внешнюю программу на выполнение
Sin (функция) - возвращает значение синуса угла
Space (функция) - возвращает строку, содержащую определенное число пробелов
Spc (функция) - позиционирование в строке вывода
Sqr (функция) - подсчет значения квадратного корня числа
Static (оператор) - используется на уровне модуля для объявления переменных и выделяет место в памяти для их хранения. Переменные сохраняют значения до завершения программы
Stop (оператор) - приостанавливает выполнение программы
Str (функция) - возвращает строковое представление числа
StrComp (функция) - возвращает результат сравнения строк
StrConv (функция) - возвращает преобразованную строку
String (функция) - возвращает строку заданной длины из одинаковых символов
Sub (оператор) - объявляет имя, параметры и тело процедуры
Switch (функция) - подсчитывает значения списка выражении и возвращает значение или выражение, связанное с выражением из списка, значение которого равно True
Tab (функция) - позиционирование в строке вывода
Tan (функция) - возвращает значение тангенса угла
Time (оператор) - устанавливает значение системных часов
Time (функция) - возвращает значение типа Date, указывающее текущее системное время
Timer (функция) - возвращает число секунд, прошедших после полуночи
TimeSerial (функция) - возвращает значение типа Date, содержащее время для заданного часа, минуты и секунды
Time Value (функция) - возвращает значение типа Date, содержащее время суток
Trim (функция) - возвращает копию строки без начальных и конечных пробелов
Type (оператор) - объявляет на уровне модуля специализированный тип данных
TypeName (функция) - возвращает строку информации о заданной переменной
UBound (функция) - возвращает значение наибольшего индекса для данной размерности массива
UCase (функция) - возвращает строку, преобразованную в верхний регистр
Unload (оператор) - выгружает форму или элемент управления из памяти
Unlock (оператор) - контролирует доступ других процессов ко всему или части открытого файла
Val (функция) - возвращает числовое представление строки
VarType (функция) - возвращает значение, указывающее тип переменной
Weekday (функция) - возвращает целое число, представляющее день недели
While...Wend (оператор) - выполняет в цикле последовательность команд до тех пор, пока верно условие
Width # (оператор) - назначает ширину строки вывода для операции записи в открытый файл
With (оператор) - выполняет последовательность команд для конкретного объекта или переменной специализированного типа
Write # (оператор) - записывает данные в файл
Хоr (операция) - исключающее ИЛИ
Year (функция) - возвращает целое число, представляющее год
Спасибо сказали: Владимир В., Jokk Ma

3 года 10 мес. назад #4 от Mira
Visual Basic типы данных:

Boolean - логический тип. Для хранения переменной отводятся 2 байта. Переменная может принимать только 2 значения True(Истина) и False(Ложь).

Byte
 - числовой тип. Для хранения переменной отводиться 1 байт. Значения переменной может находиться в промежутке от 0 до 255. Знак не используется.

Char
 - символьный тип. Для хранения переменной отводиться 2 байта. В качестве значения переменной обычно применяются символы, так как используются теперь 2 байта. Разработчики могут применять символы Unicode.

Date
 - предназначен для хранения дат. Переменная занимает 8 байт. Возможные значения находятся в промежутке от 1 января 100 года нашей эры до 31 декабря 9999 года.

Decimal
 - самый мощный числовой тип. Для хранения переменной подобного типа отводиться 16 байт. Отрицательная и положительная границы промежутка, в котором располагаются возможные значения этой переменной, одинаковы по модулю и равны +/- 79 228 162 514 264 337 593 543 950 335, если использовать целые числа. Если же необходимо хранить дробные величины, то границы возможных значений будут смещены на несколько порядков в зависимости от того, сколько знаков после запятой использует разработчик. Подобный тип может использоваться только для хранения десятичных дробей. Разработчик может использовать до 28 знаков после запятой.

Double
 - это числовой тип. Применятся для хранения чисел в экспоненциальной форме. Для хранения переменной отводится 8 байт. Отрицательные значения находятся в промежутке от - 1,79769313486231E+308 до -4,94065645841247E-324. Положительные значения входят в промежуток от 4,94065645841247E-324 до 1,79769313486231E+308.

Integer
 - предназначен для обработки целочисленных значений. Переменная подобного типа занимает 4 байта. Возможные значения находятся в промежутке от - 2 147 483 648 до 2 147 483 647.

Long
 - предназначен для целочисленных значений. Для хранения переменной отводится байт. Возможные значения переменной подобного типа находятся в промежутке от - 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807.

Object
 - по сути, переменная подобного типа является всего лишь ссылкой на некий конкретный экземпляр какого либо объекта. Для хранения переменной отводятся 4 байта.

Short
 - облегченный целочисленный тип. Для хранения переменной отводятся 2 байта. Возможные значения переменной данного типа находятся в промежутке от - 32 768 до 32 767.

Single
 - предназначен для хранения чисел в экспоненциальной форме. Для хранения переменной отводятся 4 байта. Отрицательные возможные значения переменной такого типа расположены в промежутке от - 3,402823E+38 до -1,401298E-45. Положительные значения укладываются в промежуток от 1,401298E-45 до 3,402823E+38.

String - строковый тип. Предназначен для хранения строк различной длинны. Возможная длинна строки, может, доходит до 2-х миллионов символов кодировки Unicode. Объем памяти для хранения переменной выделяется в зависимости от длинны строки.

3 года 10 мес. назад #5 от Mira
Массив – это набор переменных одного типа с одним и тем же именем. Каждая такая ячейка памяти является элементом массива, и у каждой есть свой порядковый номер, определяющий ее место. Первому элементу всегда присваивается номер 0.

Чтобы объявить массив используют следующий синтаксис:
Dim | Public | Private ArrayName(Subscript) As DataType

·        Dim | Public | Private – ключевое слово Visual Basic, которое определяет область его видимости (см. выше раздел «Переменные»).
·        ArrayName – имя массива.
·        Subscript – номер последнего элемента в массиве (например, если это чис­ло 6, то в массиве будет семь элементов; помните, что номера эле­ментов в массиве начинаются с нуля).
·        As – ключевое слово Visual Basic, которое предваряет объявление типа.
·        DataType – любой допустимый в Visual Basic тип данных, например «Integer» или «Double».
 
Следовательно, объявление массива из пяти элементов типа «Integer» должно выглядеть так:
Dim MyArray(4) As Integer
 
Чтобы присвоить каждому элементу этого массива некоторое значение, необходимо указать имя массива и в круглых скобках добавить номер соответствующего элемента массива:
MyArray(0) =  9
MyArray(l) = 342
MyArray(2) = 2746
MyArray(3) = 0
MyArray(4) = 8901
 
Хотя обычно число элементов в массиве определяется при его объявлении, иногда необходимо изменить размеры массива во время выполнения программы. Изменение числа элементов в массиве называется переопределением размеров массива. Для изменения числа элементов уже существующего массива используют ключевое слово «ReDim» и следующий синтаксис:
ReDim [Preserve] ArrayName(Subscript) [As DataType]
·        ReDim — ключевое слово Visual Basic, означающее изменение размеров массива.
·        Preserve — необязательное ключевое слово Visual Basic, указывающее на необходимость сохранения прежних значений элементов массива. Если при переопределении размеров массива это ключевое слово не использовать, значения всех элементов будут равны: нулю — для числовых типов данных, пустой строке — для строкового типа и «Empty» — для типа Variant.
·        ArrayName — имя массива.
·        Subscript — индекс последнего элемента в массиве.
·        As — ключевое слово Visual Basic, предваряющее объявление типа данных.
·        DataTуре — любой допустимый в Visual Basic тип данных. При переопределении размера массива этот параметр необязателен, т.к. изменить тип невозможно. Тип массива можно переопределить ключевым словом «ReDim» только в том случае, если массив имеет тип «Variant».
Спасибо сказали: Владимир В.

3 года 10 мес. назад - 3 года 10 мес. назад #6 от Mira
Нашим спецам по Excel это кажется смешным, но надо с чего-то начать. Они смогут помочь советами как работать с диапазонами или какими способами лучше решать разные задачи.

Создаю новую книгу.
В столбец A прописываю небольшой случайный набор чисел в диапазоне 0-36

=СЛУЧМЕЖДУ(0;36)






Если нужно зафиксировать генерацию, то ее нужно перекопировать как значения.
Вложения:
Спасибо сказали: Владимир В., Jokk Ma

3 года 10 мес. назад - 3 года 10 мес. назад #7 от Mira
ПОИСК НОМЕРА В ГЕНЕРАЦИИ (ДИАПАЗОНЕ СПИНОВ)
А теперь нужно написать функцию поиска по строкам всех вхождений по заданному значению.  

Public Function  findAllPos(z as Range, n as Long) as Variant

которая пройдет по всему диапазону номеров в столбике A и для указанного номера соберет №№ спинов, на которых этот номер выпал.

На выходе будет массив произвольной длинны.

Желательно явно не указывать диапазон со спинами, пусть макрос сам определит где его начало и конец в указанной колонке A:A. В дальнейшем аргументом может быть не только вся колонка, а любой диапазон вертикальный или горизонтальный
Желательно обработать ошибку, если номера нет совсем.

Какие будут варианты решения? Готовую функцию alt2005 не использовать.

3 года 10 мес. назад #8 от LUCKY-13
'К листам будем обращаться через переменные
Dim Sheet1_WS, Sheet2_WS As Worksheet
'Переменная для прохождения срок на листе (в массиве)
Dim i As Long
'Массив, в котором будут храниться наши данные
Dim R_data As Variant
'Переменные последней строки и колонки
Dim FinalRow, FinalColumn As Long
'Можно инициализировать лист не по названию, а по порядковому номеру
'Set Sheet1_WS = Application.ThisWorkbook.Worksheet("Sheet1")
Set Sheet1_WS = Application.ThisWorkbook.Sheets(1)
Set Sheet2_WS = Application.ThisWorkbook.Sheets(2)
'Поиск последней не пустой строки в первой колонке
'Нужно, что бы данные не были отфильтрованы, иначе последняя строка будет последней строкой в фильтре
'Также в последней строке, в первой колонке, не должно быть пустой ячейки. Конечно, если в этой строке вообще есть данные. Иначе последней строкой будет последняя не пустая ячейка.
FinalRow = Sheet1_WS.Cells(Rows.Count, 1).End(xlUp).Row '=10 000
'Поиск последней не пустой колонки в первой строке
FinalColumn = Sheet1_WS.Cells(1, Columns.Count).End(xlToLeft).Column '=50
'Присваиваем массиву диапазон данных на Листе 1
R_data = Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, FinalColumn))
For i = 2 To FinalRow
    'Выполняем нужные нам операции с данными.
    'Проверяем, что бы не было деления на ноль.
    'Предполагается, что в колонке 2 и 3 стоят числовые данные
    'Иначе потребуется обработка ошибок
    If R_data(i, 3) <> 0 Then
        R_data(i, FinalColumn) = R_data(i, 2) / R_data(i, 3)
    End If
Next i
'Копируем данные из массива обратно на Лист1
'Перед этим очищаем данные на листе (если есть форматирование или формулы, то лучше Sheet1_WS.Cells.ClearContents)
Sheet1_WS.Cells.Delete
Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, FinalColumn)) = R_data
'Копируем данные на Лист2, копируем первые 10 колонок.
Sheet2_WS.Range(Sheet2_WS.Cells(1, 1), Sheet2_WS.Cells(FinalRow, 10)) = R_data
'Закрываем книгу и сохраняем её
Workbooks(Application.ThisWorkbook.Name).Close SaveChanges:=True

3 года 10 мес. назад - 3 года 10 мес. назад #9 от alt2005
Наcколько я понял, LUCKY13 использует процедуру типа SUB, а не функцию типа FUNCTION. Отличия в том, что процедура работает побыстрее (как я думаю), но ее нельзя вызвать как функцию ячейки типа =getResult(....)
Функцию же можно вызвать так же,  как и стандартную функцию EXCEL. Но она не может изменять другие ячейки, кроме той, их которой вызвана (значения функции возвращаются в ячейку вызова автоматически). И такую функцию можно копировать, но работает это медленно. 
Конструкции вида 
Dim Sheet1_WS, Sheet2_WS As Worksheet
Dim R_data As Variant
Set Sheet1_WS = Application.ThisWorkbook.Sheets(1)
R_data = Sheet1_WS.Range(Sheet1_WS.Cells(1, 1), Sheet1_WS.Cells(FinalRow, FinalColumn))
For i = 2 To FinalRow
    If R_data(i, 3) <> 0 Then
....
я никогда не использовал, но попробовал только что в том файле. Время работы не изменилось.

А вот что можно сделать для ускорения - нужно загрузить данные с листа в память, типа массива. Но глобальных массивов в VBA нет, поэтому нужно создать классы для каждого нужного столбца, и массивы объявить внутри этих классов. А потом создать инстанции (экземпляры) нужных классов, один раз заполнить их, и далее просто вытаскивать значения из массивов при помощи метода, например getValue(n) где n - номер элемента в массиве (проще всего это может быть номер строки).
Вот код для классов

1. Класс clsSheet для столбца
Option Explicit
Dim mas(arraySize) As Long
Public Function setValues(sheet As String, column As Long)
 Dim i As Long
 Dim value As Variant
 '
 For i = 1 To arraySize
   On Error GoTo erro
   value = Worksheets(sheet).Cells(i, column)
   If IsNumeric(value) Then
    mas(i) = value
   End If
erro:
 Next i
End Function
'
Public Function getValue(row As Long) As Long
 getValue = mas(row)
End Function


Класс clsMas для хранения объектов clsSheet: 
Option Explicit
Dim classes(10) As clsSheet

Public Function setClass(classID As Long, sheet As String, Optional column = 0)
 Dim cNew As clsSheet
 Dim col As Long
 '
 If column = 0 Then
  col = classID
 Else
  col = column
 End If
 Set cNew = New clsSheet
 Call cNew.setValues(sheet, col)
 Set classes(classID) = cNew
End Function
'
Public Function getClass(classID As Long) As clsSheet
 Set getClass = classes(classID)
End Function


Ну и как эту хрень использовать


 Set cMas = New clsMas - создание контейнера классов
 Call cMas.setClass(1, "SS1") - создание экземпляра класса для столбца 1, SS1 - название листа (sheet)

В функции  getResult есть оператор
Set clasZ = cMas.getClass(1)
он нужен для создания 1-го столбца, где живут номера.

А вот тут вместо чтения с листа (оно закомментировано), читаем значения номера из класса. 
'   za = Worksheets(z.Worksheet.Name).Cells(i, 1)
   za = clasZ.getValue(i)

Использование классов ускоряет расчеты примерно в 2 раза (на моем компе) по сравнению с перебором значений на листе. Но нужно в начале работы создать объект класса и заполнить его значениями с листа (процедура ausfullen). Причем если в столбец загнать другие данные, то опять нужно вызывать процедуру "ausfullen"
Вложения:
Спасибо сказали: DLK

3 года 10 мес. назад #10 от WoodForest
Вот вы заморочились, обычному игроку это сложно и непонятно, причем нет никаких гарантий того, что объявленная формула будет считать именно так, как это написано в описании Excel, я уже неоднократно приводил примеры несовпадения реальных вычислений с описанием того, как именно такие вычисления происходят, особенно в тех случаях когда надо считать большие массивы... Уверен, что для большинства майнеров, готовых на приобретение дополнительных знаний для того, чтобы использовать понятный протокол статистики своих действий, нужен простой способ, изложенный в методическом руководстве, который понятен любому школьнику с 5-6 класса. Даже я большую часть специально разработанных мной! формул на основе функций не держу в голове и не помню, поскольку, можно прочитать синтаксис и сразу понять чего откуда берется для вычислений. Поймите простую истину - программист (разработчик) не может быть профессиональным майнером, и наоборот профи не может быть программистом Одновременно! 
"Человек ноября" к\ф, где гл. герой профи киллер ( актер Пирс Броснан), говорит другому такому же коллеге, которого когда-то стажировал, простую истину - "ты можешь быть или профи киллером или хорошим человеком, но нельзя быть и тем и другим одновременно" (Палач не может быть одновременно доктором - если уже совсем откровенно).
Народ ждет от нас простое и понятное методическое руководство с готовым набором рабочих формул с проверенным синтаксисом, прочитав которое он сможет открыть любой excel начиная с 2010, построить таблицы и успешно майнить! Т.е. все что он готов изучить - это методическое руководство типа - excel своими руками (сделай сам и получи прибыль)... И только единицы возможно смогут захотеть и заморочиться в глубоком изучении excel и VBA, чтобы модернизировать под свои! интересы уже готовый продукт.
Спасибо сказали: Jokk Ma

3 года 10 мес. назад #11 от DLK
Эта тема как раз для тех, кто хочет позаморачиваться.
Трехэтажные формулы Excel требуют еще гору дополнительных колонок для хранения промежуточных результатов. На уровне макросов все решается проще и быстрее с поиском и переборами. Когда говорим про имитацию стратегии с условиями, выборами, какими-то правилами, то сделать это только формулами очень громоздко и часто нереально.
Спасибо сказали: WoodForest

3 года 10 мес. назад #12 от WoodForest
На счет проще и быстрее, есть вопросы. Может для мощных компьютеров - да, но для обычных ноутов среднего класса, excel требует много ресурсов и свободного пространства на жестком диске, под виндой это вообще нереально долго...

3 года 10 мес. назад - 3 года 10 мес. назад #13 от Mira
Можно голову сломать

1. Почему "0" вообще неправильно считается? =findAllPos($A:$A;D2;1)
2. Почему "6" неправильно считается?  =findAllPos($A:$A;J2;1)
3. Немогу сделать, чтобы при изменении ячейки в заданном аргументе z as Range пересчитать все формулы на странице. Хотела обойтись без макроса к Лист1 (Worksheet_Change и .Calculate), но никакой вариант не работал. Наверное придется отказаться от динамического массива arSpins() ? Сейчас подразумевается, что история спинов будет 1 на листе (arSpins грузится 1 раз если пустой), а вдруг захочется несколько историй проанализировать и сравнить. 


Option Explicit
Dim arSpins() As Integer 
'*********************
Public Function getSpin(row As Long) As Integer
  getSpin = arSpins(row)
End Function
'*********************
Public Function findAllPos(z As Range, num As Integer, index As Integer) As Variant
 Dim arr, i&, j&, k&
 If (Not Not arSpins) = 0 Then 
     arr = z
     k = 1
      For i = 1 To UBound(arr)
       For j = 1 To UBound(arr, 2)
            If IsNumeric(arr(i, j)) Then
                ReDim Preserve arSpins(k)
                arSpins(k) = arr(i, j)
                k = k + 1
            End If
       Next
      Next
 End If
 k = 1
 j = 0
 Dim arResult() As Integer
 For i = LBound(arSpins) To UBound(arSpins)
   If arSpins(i) = num Then
                ReDim Preserve arResult(k)
                 arResult(k) = i - j  
                    j = i
                    k = k + 1
   End If
 Next
 
If (Not Not arResult) = 0 Then
            findAllPos = ""
Else
        If index <= UBound(arResult) Then
            findAllPos = arResult(index)
        Else
            findAllPos = ""
        End If
End If
End Function
'*********************



Файл Mira_macros.xlsm во вложении
Вложения:
Спасибо сказали: LUCKY-13

3 года 10 мес. назад #14 от LUCKY-13
Чтобы не писать отдельные макросы в Лист или Книгу, используй классы. Alt2005 как раз и написал вызов класса нужной копии листа. Через call .calculate можно будет пересчитывать. При этом не забудь отключать events, чтобы обработка событий не вошла в бесконечный цикл.