Sub Заполнение_пустот_нолями()
' В выделении находим пустые ячейки и зануляем их
For Each Cell In Selection
If Cell.value = "" Then Cell.value = "0"
Next
End Sub
Sub Поиск_повторений()
' В выделении находим ячейки с одинаковыми значениями
' и выделяем их цветом
Dim Count As Integer
For Each Cell In Selection
If Cell.value <> "" Then
Count = 0
For Each Cell2 In Selection
If Cell.value = Cell2.value Then Count = Count + 1
Next
If Count > 1 Then
With Cell.Interior
.ColorIndex = 4
End With
End If
End If
Next
End Sub
Sub Убрать_пробелы_по_краям()
' В выделении уберем во всех ячейках лишние пробелы
Dim Count As Integer
For Each Cell In Selection
If Cell.value <> "" Then
1:
Count = 0
If Left(Cell.value, 1) = " " Then
Cell.value = Right(Cell.value, Len(Cell.value) - 1)
Count = Count + 1
End If
If Right(Cell.value, 1) = " " Then
Cell.value = Left(Cell.value, Len(Cell.value) - 1)
Count = Count + 1
End If
If Count > 0 Then GoTo 1
End If
Next
End Sub
Sub DelIndifferentFont()
'
' Удалить все строки, в которых шрифт отличается от шрифта
' первой ячейки выбора
'
Dim FontSize, FontBold
Dim WasDeleted
' сохраним параметры оригинального шрифта
FontSize = Cells(Selection.Row, Selection.Column).Font.Size
FontBold = Cells(Selection.Row, Selection.Column).Font.Bold
For i = 1 To Selection.Count
WasDeleted = False
For Each Cell In Selection
If (Cell.Font.Size <> FontSize) Or _
(Cell.Font.Bold <> FontBold) Or _
(Cell.value = "") Then
Rows(Cell.Row).Delete Shift:=xlUp
WasDeleted = True
End If
Next
If Not WasDeleted Then Exit For
Next
End Sub
Sub DelSameRows()
'
' Макрос записан 18.10.2007 (Alexey V. Nikitayev)
' Удалим повторяющиеся строки
'
Dim CurrRow, i, CurrColumn
Dim FontSize, FontBold
' сохраним текущую строку и столбец
CurrColumn = Selection.Column
CurrRow = Selection.Row + 1
' идём на много (40000) строк вниз и удаляем повторения
For i = 1 To 40000
If (Cells(CurrRow, CurrColumn) = Cells(CurrRow - 1, CurrColumn)) Then
Rows(CurrRow).Delete Shift:=xlUp
Else
CurrRow = CurrRow + 1
End If
' если ниже ничего нет - то прерываем обработку
If (Cells(CurrRow, CurrColumn) = "") Then
Exit For
End If
Next
End Sub
Sub CollectInfoByMonth()
'
' Макрос записан 18.10.2007 (Alexey V. Nikitayev)
' Сбор для каждого наименования со всех страниц данных о продажах по месяцам
' Цель - собрать результирующие данные
' Должна быть выделена первая ячейка - с неё возьмём номер первой строки
'
Dim CurrSheet, ReportSheet
Dim FirstRow, FirstColumn, CurrRow, i, j
' сохраним текущую строку и столбец
FirstRow = Selection.Row
FirstColumn = Selection.Column
CurrRow = 1
ReportSheet = Worksheets.Count
FirstMonthColumn = 2
FirstReportColumn = 4
TotalMonthCount = 6
' идём по всем месяцам
For CurrSheet = 1 To TotalMonthCount
' сбросим счётчик первой строки (применяется только для оптимизации)
NextRowBegin = 11
' идём по столбцу названий в итоговом отчёте
For i = FirstRow To FirstRow + 20000
' ищем текущую позицию на листе месяца №CurrSheet - пробегаем его
For CurrRow = NextRowBegin To 20000
If Worksheets(CurrSheet).Cells(CurrRow, FirstMonthColumn) = _
Worksheets(ReportSheet).Cells(i, FirstColumn) Then
'если нашли упоминание о данном товаре - заполним ячейки отчёта
' количество - 12-й столбец
Worksheets(ReportSheet).Cells(i, FirstReportColumn) = _
Worksheets(CurrSheet).Cells(CurrRow, 12)
' сумма - 13-й столбец
Worksheets(ReportSheet).Cells(i, FirstReportColumn + 1) = _
Worksheets(CurrSheet).Cells(CurrRow, 13)
' доход - 18-й столбец
Worksheets(ReportSheet).Cells(i, FirstReportColumn + 2) = _
Worksheets(CurrSheet).Cells(CurrRow, 18)
' % наценки - 19-й столбец
Worksheets(ReportSheet).Cells(i, FirstReportColumn + 3) = _
Worksheets(CurrSheet).Cells(CurrRow, 19)
' оборачиваемость - 22-й столбец
Worksheets(ReportSheet).Cells(i, FirstReportColumn + 5) = _
Worksheets(CurrSheet).Cells(CurrRow, 22)
NextRowBegin = CurrRow
Exit For
End If
' если ниже ничего нет или нет такой позиции - то переходим к следующему месяцу
If (Worksheets(CurrSheet).Cells(CurrRow, FirstMonthColumn) = "") Or _
(Worksheets(CurrSheet).Cells(CurrRow, FirstMonthColumn) > _
Worksheets(ReportSheet).Cells(i, FirstColumn)) Then
Exit For
End If
Next
If Worksheets(ReportSheet).Cells(i, FirstColumn) = "" Then
Exit For
End If
Next
' если ниже ничего нет - то прерываем обработку
FirstReportColumn = FirstReportColumn + 6
Next
End Sub
Sub SelectAllDataToOneSheet()
'
' Макрос записан 18.10.2007 (Alexey V. Nikitayev)
' Цель - создать отдельный лист и туда собрать все записи с повторениями
' Должна быть выделена первая ячейка - с неё возьмём номер первой строки
'
Dim CurrSheet, ReportSheet
Dim FirstRow, FirstColumn, CurrRow, i, j
' сохраним текущую строку и столбец
FirstRow = Selection.Row
FirstColumn = Selection.Column
' добавим пустой лист
Worksheets.Add After:=Sheets(Sheets.Count)
CurrRow = 1
ReportSheet = Worksheets.Count
' идём по всем предыдущим страницам - там должны быть отсортированные отчёты
For CurrSheet = 1 To Worksheets.Count - 1
For i = FirstRow To FirstRow + 20000
If Worksheets(CurrSheet).Cells(i, FirstColumn) <> "" Then
For j = 1 To 100
Worksheets(ReportSheet).Cells(CurrRow, j) = _
Worksheets(CurrSheet).Cells(i, j)
Next
CurrRow = CurrRow + 1
End If
Next
Next
End Sub
Type valuetype
value As Double
idx As Integer
End Type
Sub AutomaticReportForCorrelationAnalysis()
' Анализ таблицы корелляционного анализа (Сервис->Анализ данных...->Корреляция)
' Automatic report for correlation analysis
' Service -> Data analysis... -> Correlation
' Макрос записан 12.01.2008 (Alexey V. Nikitayev)
' Цель - для каждого товара найти сопутствующие и замещающие.
' Должен быть выделен лист с данными корреляционного анализа
' 1. Найдём количество элементов
maxrows = 1
For x = 2 To 1000
If Application.ActiveSheet.Cells(1, x).value <> "" Then maxrows = maxrows + 1 Else Exit For
Next
Dim maxvalues(3) As valuetype
Dim minvalues(3) As valuetype
' 2. Цикл по столбцам
For x = 2 To maxrows
' 3. Очистим значения максимальных сопутствующих и замещающих
For i = 1 To 3
maxvalues(i).value = -10
maxvalues(i).idx = 1
minvalues(i).value = 10
minvalues(i).idx = 1
Next
' 4. Ищем максимальные величины корелляции в текущем столбце
For y = x + 1 To maxrows
CurrValue = Application.ActiveSheet.Cells(y, x).value
If maxvalues(1).value < CurrValue Then
maxvalues(3) = maxvalues(2)
maxvalues(2) = maxvalues(1)
maxvalues(1).value = CurrValue
maxvalues(1).idx = y
ElseIf maxvalues(2).value < CurrValue Then
maxvalues(3) = maxvalues(2)
maxvalues(2).value = CurrValue
maxvalues(2).idx = y
ElseIf maxvalues(3).value < CurrValue Then
maxvalues(3).value = CurrValue
maxvalues(3).idx = y
End If
If minvalues(1).value > CurrValue Then
minvalues(3) = minvalues(2)
minvalues(2) = minvalues(1)
minvalues(1).value = CurrValue
minvalues(1).idx = y
ElseIf minvalues(2).value > CurrValue Then
minvalues(3) = minvalues(2)
minvalues(2).value = CurrValue
minvalues(2).idx = y
ElseIf minvalues(3).value > CurrValue Then
minvalues(3).value = CurrValue
minvalues(3).idx = y
End If
Next
' 5. Выводим результат поисков
Application.ActiveSheet.Cells(maxrows + 1, x).value = Application.ActiveSheet.Cells(1, x).value
Application.ActiveSheet.Cells(maxrows + 2, x).value = "Продаётся вместе с:"
If maxvalues(1).value > 0.7 Then
Application.ActiveSheet.Cells(maxrows + 3, x).value = Application.ActiveSheet.Cells(maxvalues(1).idx, 1).value
If maxvalues(2).value > 0.7 Then
Application.ActiveSheet.Cells(maxrows + 4, x).value = Application.ActiveSheet.Cells(maxvalues(2).idx, 1).value
If maxvalues(3).value > 0.7 Then
Application.ActiveSheet.Cells(maxrows + 5, x).value = Application.ActiveSheet.Cells(maxvalues(3).idx, 1).value
End If
End If
End If
Application.ActiveSheet.Cells(maxrows + 7, x).value = "Вытесняется:"
If minvalues(1).value < -0.5 Then
Application.ActiveSheet.Cells(maxrows + 8, x).value = Application.ActiveSheet.Cells(minvalues(1).idx, 1).value
If minvalues(2).value < -0.5 Then
Application.ActiveSheet.Cells(maxrows + 9, x).value = Application.ActiveSheet.Cells(minvalues(2).idx, 1).value
If minvalues(3).value < -0.5 Then
Application.ActiveSheet.Cells(maxrows + 10, x).value = Application.ActiveSheet.Cells(minvalues(3).idx, 1).value
End If
End If
End If
Next
End Sub