чего-то в голову ударило, написал еще вот такой изврат [vba]
Код
Public Sub rr() Dim arr(), i& With CreateObject("ScriptControl") .Language = "JScript" .AddCode "function a(b){return b.replace(/[А-ЯЁ]/gm,function(c){return c.toLowerCase()})}" arr = Selection.Value For i = LBound(arr) To UBound(arr) If Len(arr(i, 1)) Then arr(i, 1) = .Run("a", arr(i, 1)) Next Selection.Value = arr End With End Sub
[/vba]
чего-то в голову ударило, написал еще вот такой изврат [vba]
Код
Public Sub rr() Dim arr(), i& With CreateObject("ScriptControl") .Language = "JScript" .AddCode "function a(b){return b.replace(/[А-ЯЁ]/gm,function(c){return c.toLowerCase()})}" arr = Selection.Value For i = LBound(arr) To UBound(arr) If Len(arr(i, 1)) Then arr(i, 1) = .Run("a", arr(i, 1)) Next Selection.Value = arr End With End Sub
Application.ScreenUpdating = False With ThisDocument.Tables(1).Range.Cells For i = 1 To .Count With .Item(i).Range.Paragraphs .Item(1).Range.Text = "Номер документа №: " & Format(start_num2 + i - 1, "00000000") & vbCr .Item(.Count).Range.Text = " № " & Format(start_num + i - 1, "00000000") End With Next End With Application.ScreenUpdating = True End Sub
[/vba]
Здравствуйте [vba]
Код
Sub Нумерация() Dim start_num&, start_num2&, i&
start_num = 10012177 start_num2 = 1
Application.ScreenUpdating = False With ThisDocument.Tables(1).Range.Cells For i = 1 To .Count With .Item(i).Range.Paragraphs .Item(1).Range.Text = "Номер документа №: " & Format(start_num2 + i - 1, "00000000") & vbCr .Item(.Count).Range.Text = " № " & Format(start_num + i - 1, "00000000") End With Next End With Application.ScreenUpdating = True End Sub
еще вариант Сводная + подключение + небольшой макрос для обновления (в модуле Лист2) [vba]
Код
Private Sub Worksheet_Activate() Dim LastRefreshed As Date With Sheets("Лист3").PivotTables(1) LastRefreshed = .RefreshDate: .RefreshTable Do While .RefreshDate <= LastRefreshed DoEvents Loop End With Me.ListObjects(1).QueryTable.Refresh 0 End Sub
[/vba]
еще вариант Сводная + подключение + небольшой макрос для обновления (в модуле Лист2) [vba]
Код
Private Sub Worksheet_Activate() Dim LastRefreshed As Date With Sheets("Лист3").PivotTables(1) LastRefreshed = .RefreshDate: .RefreshTable Do While .RefreshDate <= LastRefreshed DoEvents Loop End With Me.ListObjects(1).QueryTable.Refresh 0 End Sub
еще до кучи (тоже на основе кода Александра ( alex77755 )) [vba]
Код
Sub qwerty() Dim i, r, a, b, s, lr, json With Лист3 lr = .Cells(.Rows.Count, 1).End(xlUp).Row .Cells(2, 3).Resize(lr - 1, 3).ClearContents For r = 2 To lr a = .Cells(r, 1) b = .Cells(r, 2) s = "http://steamcommunity.com/market/priceoverview/?currency=5&country=us&appid=" s = s & a & "&market_hash_name=" s = s & b & "&format=json" i = GetHTTPResponse(s) Debug.Print i With CreateObject("scriptcontrol") .Language = "jscript" Set json = .eval("(" & i & ")") End With On Error Resume Next .Cells(r, 3) = json.lowest_price .Cells(r, 4) = json.median_price On Error GoTo 0 .Cells(r, 5) = Now Next r End With End Sub
Private Function GetHTTPResponse(ByVal sURL As String) As String Dim oXMLHTTP On Error Resume Next Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") With oXMLHTTP .Open "GET", sURL, False .SetRequestHeader "Cache-Control", "max-age=0" .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.41 Safari/537.36 OPR/35.0.2066.10 (Edition beta)" .SetRequestHeader "Accept-Encoding", "deflate" .SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" .send GetHTTPResponse = .responseText End With Set oXMLHTTP = Nothing End Function
[/vba]
еще до кучи (тоже на основе кода Александра ( alex77755 )) [vba]
Код
Sub qwerty() Dim i, r, a, b, s, lr, json With Лист3 lr = .Cells(.Rows.Count, 1).End(xlUp).Row .Cells(2, 3).Resize(lr - 1, 3).ClearContents For r = 2 To lr a = .Cells(r, 1) b = .Cells(r, 2) s = "http://steamcommunity.com/market/priceoverview/?currency=5&country=us&appid=" s = s & a & "&market_hash_name=" s = s & b & "&format=json" i = GetHTTPResponse(s) Debug.Print i With CreateObject("scriptcontrol") .Language = "jscript" Set json = .eval("(" & i & ")") End With On Error Resume Next .Cells(r, 3) = json.lowest_price .Cells(r, 4) = json.median_price On Error GoTo 0 .Cells(r, 5) = Now Next r End With End Sub
Private Function GetHTTPResponse(ByVal sURL As String) As String Dim oXMLHTTP On Error Resume Next Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") With oXMLHTTP .Open "GET", sURL, False .SetRequestHeader "Cache-Control", "max-age=0" .SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.41 Safari/537.36 OPR/35.0.2066.10 (Edition beta)" .SetRequestHeader "Accept-Encoding", "deflate" .SetRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" .send GetHTTPResponse = .responseText End With Set oXMLHTTP = Nothing End Function
в данном контексте закрытие временной книги попробуйте так [vba]
Код
Sub Перенос() Dim rng As Range, strFile$, OutApp As Object, bool As Boolean strFile$ = Environ("tmp") & "\последняя строка.xls" 'путь временного файла With ThisWorkbook.Sheets("Отчет за сутки") Set rng = .Range("A2:j" & Application.Max( _ .Cells(.Rows.Count, 1).End(xlUp).Row, 2)) 'задаем диапазон для переноса на лист Отчет 2016 If Application.CountA(rng) = 0 Then 'если данных для переноса нет (CountA - это функция СЧЁТЗ) MsgBox "Нет данных для переноса!" 'выводим сообщение Exit Sub 'и завершаем работу End If Application.DisplayAlerts = False rng.Copy Sheets("Отчет за 2016 г.").Range _ ("A" & .Rows.Count).End(xlUp)(2) 'копируем диапазон на лист "Отчет за 2016 г." .Copy 'копируем лист "Отчет за сутки" в новую книгу '(она автоматически становится активной) With ActiveWorkbook 'в новой книге со скопированным листом "Отчет за сутки" With .Sheets(1) 'на листе "Отчет за сутки" If rng.Rows.Count > 1 Then 'если в диапазоне больше 1 строки, то .Rows(2).Resize(rng.Rows.Count - 1).Delete 'удаляем строки со 2 по предпоследнюю включительно End If .Range(.Rows(3), .Rows(3).End(xlDown)).Delete 'удаляем все строки ниже последней непустой строки .SaveAs strFile$, 56 'сохраняем книгу во временную папку End With .Close 'закрываем временную книгу End With On Error Resume Next
Set OutApp = GetObject(, "Outlook.Application") 'пытаемся подключиться к запущенному Outllok Err.Clear On Error GoTo 0 If OutApp Is Nothing Then 'если Outllok не был запущен Set OutApp = CreateObject("Outlook.Application") 'запускаем новый экземпляр Outllok bool = True 'после отправки нужно будет его закрыть End If With OutApp.CreateItem(0) 'новое письмо .To = Join(Array("пупкин@mail.ru", _ "васичкин@mail.ru" _ ), ";") 'список получателей .Subject = "Статистика" 'тема письма .Body = "Во вложении отчет" 'текст письма .Attachments.Add strFile 'прикремпляем файл .Send 'отправляем End With DoEvents Kill strFile 'удаляем временный файл If bool Then OutApp.Quit 'закрываем Outlook, если он был запущен макросом Set OutApp = Nothing rng.ClearContents: .Parent.Save 'очищаем диапазон и сохраняем книгу MsgBox ("Внесено в отчет за 2016 год, отправлено Пупкину и Васичкину!") End With Application.DisplayAlerts = True End Sub
в данном контексте закрытие временной книги попробуйте так [vba]
Код
Sub Перенос() Dim rng As Range, strFile$, OutApp As Object, bool As Boolean strFile$ = Environ("tmp") & "\последняя строка.xls" 'путь временного файла With ThisWorkbook.Sheets("Отчет за сутки") Set rng = .Range("A2:j" & Application.Max( _ .Cells(.Rows.Count, 1).End(xlUp).Row, 2)) 'задаем диапазон для переноса на лист Отчет 2016 If Application.CountA(rng) = 0 Then 'если данных для переноса нет (CountA - это функция СЧЁТЗ) MsgBox "Нет данных для переноса!" 'выводим сообщение Exit Sub 'и завершаем работу End If Application.DisplayAlerts = False rng.Copy Sheets("Отчет за 2016 г.").Range _ ("A" & .Rows.Count).End(xlUp)(2) 'копируем диапазон на лист "Отчет за 2016 г." .Copy 'копируем лист "Отчет за сутки" в новую книгу '(она автоматически становится активной) With ActiveWorkbook 'в новой книге со скопированным листом "Отчет за сутки" With .Sheets(1) 'на листе "Отчет за сутки" If rng.Rows.Count > 1 Then 'если в диапазоне больше 1 строки, то .Rows(2).Resize(rng.Rows.Count - 1).Delete 'удаляем строки со 2 по предпоследнюю включительно End If .Range(.Rows(3), .Rows(3).End(xlDown)).Delete 'удаляем все строки ниже последней непустой строки .SaveAs strFile$, 56 'сохраняем книгу во временную папку End With .Close 'закрываем временную книгу End With On Error Resume Next
Set OutApp = GetObject(, "Outlook.Application") 'пытаемся подключиться к запущенному Outllok Err.Clear On Error GoTo 0 If OutApp Is Nothing Then 'если Outllok не был запущен Set OutApp = CreateObject("Outlook.Application") 'запускаем новый экземпляр Outllok bool = True 'после отправки нужно будет его закрыть End If With OutApp.CreateItem(0) 'новое письмо .To = Join(Array("пупкин@mail.ru", _ "васичкин@mail.ru" _ ), ";") 'список получателей .Subject = "Статистика" 'тема письма .Body = "Во вложении отчет" 'текст письма .Attachments.Add strFile 'прикремпляем файл .Send 'отправляем End With DoEvents Kill strFile 'удаляем временный файл If bool Then OutApp.Quit 'закрываем Outlook, если он был запущен макросом Set OutApp = Nothing rng.ClearContents: .Parent.Save 'очищаем диапазон и сохраняем книгу MsgBox ("Внесено в отчет за 2016 год, отправлено Пупкину и Васичкину!") End With Application.DisplayAlerts = True End Sub
еще вариант, для каждого юзера нужно создать представление (я создал 2 - Старт и Программисты пароль на книгу - 123456
[vba]
Код
Sub scr(s$) ActiveWorkbook.Unprotect Лист4.[C1] ActiveWorkbook.CustomViews(s).Show ActiveWorkbook.Protect Лист4.[C1], True, False End Sub
[/vba]
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next If Target.Address(0, 0) <> "B2" Then Application.CutCopyMode = False If Target.Address(0, 0) <> "B1" Then Range("B1").Select End If On Error GoTo 0 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "B2" Then Exit Sub On Error Resume Next p_ = WorksheetFunction.VLookup(Range("B1"), Лист4.[A2:B999], 2, False) On Error GoTo 0 If Range("B2") <> p_ Then MsgBox "Неверный пароль": Exit Sub scr [b1] End Sub
[/vba]
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) scr "Старт" End Sub
Private Sub Workbook_Open() scr "Старт" End Sub
[/vba]
еще вариант, для каждого юзера нужно создать представление (я создал 2 - Старт и Программисты пароль на книгу - 123456
[vba]
Код
Sub scr(s$) ActiveWorkbook.Unprotect Лист4.[C1] ActiveWorkbook.CustomViews(s).Show ActiveWorkbook.Protect Лист4.[C1], True, False End Sub
[/vba]
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next If Target.Address(0, 0) <> "B2" Then Application.CutCopyMode = False If Target.Address(0, 0) <> "B1" Then Range("B1").Select End If On Error GoTo 0 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "B2" Then Exit Sub On Error Resume Next p_ = WorksheetFunction.VLookup(Range("B1"), Лист4.[A2:B999], 2, False) On Error GoTo 0 If Range("B2") <> p_ Then MsgBox "Неверный пароль": Exit Sub scr [b1] End Sub
[/vba]
[vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) scr "Старт" End Sub