Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Преобразование данных перед загрузкой в БД, Преобразовать данные в int затем в varchar перед загрузкой в базу данных SQL
 
Ну я же пишу excel-макрос на vba.
Зачем мне форум sql?  
Преобразование данных перед загрузкой в БД, Преобразовать данные в int затем в varchar перед загрузкой в базу данных SQL
 
Обычно, я это делаю строкой:
& "[Номер полиса],[Дата выдачи]" _
& ")Values ('" & Cells(iRow, 3).Value & "',convert(datetime,(replace('" & Cells(iRow, 4).Value & "','dd.mm.yyyy','yyyy-mm-dd')),103),"')".

Но сейчас не могу додуматься как конвертировать строку два раза.
Преобразование данных перед загрузкой в БД, Преобразовать данные в int затем в varchar перед загрузкой в базу данных SQL
 
В отчете содержатся данные разного типа.
Необходимо преобразовать данные в int затем в varchar перед загрузкой в базу данных SQL.

В БД формат столбца varchar
Изменено: Татьяна Басова - 22.05.2023 13:39:14
Автофильтр для сводной таблицы по последнему дню месяца от текущей даты
 
Как всегда всё круто, спасибо!!!

Вдруг кому пригодится:
Код
Sub RefreshPivot()
'
' RefreshPivot Macro
'
    Dim oPi, IsFind As Boolean
    On Error Resume Next
    With ActiveSheet.PivotTables("PivotTable1").PivotFields("Месяц")
        .ClearAllFilters
        For Each oPi In .PivotItems
            If CDate(oPi.Name) <> Range("F1").Value And CDate(oPi.Name) <> Range("F2").Value Then
                oPi.Visible = False
            Else
                IsFind = True
            End If
        Next
        If Not IsFind Then
            .ClearAllFilters
            MsgBox "Не найдена дата" & Range("F1").Text, vbInformation, "excel"
        End If
    End With
End Sub
Автофильтр для сводной таблицы по последнему дню месяца от текущей даты
 
Приложила файлик
Автофильтр для сводной таблицы по последнему дню месяца от текущей даты
 
Добрый день!

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

Сводная таблица называется "PivotTable1"
Лист "Sheet1"
Фильтр по столбцу "Месяц"
Был написан макрос, который берет значение для фильтра из ячейки (B57), но он выдает ошибку:
"Нельзя установить свойство CurrentPage класса PivotFields"

Макрос:
Код
Sub RefreshPivot()
'
' RefreshPivot Macro
'
    Sheets("Sheet1").Select
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Месяц"). _
        ClearAllFilters
    ActiveSheet.PivotTables("PivotTable1").PivotFields("Месяц").CurrentPage _
        = ThisWorkbook.Worksheets("Sheet1").Range("B57").Value
End Sub
Изменено: Татьяна Басова - 31.01.2022 18:01:14 (Приложила файл)
Insert данных из excel в БД SQL
 
Добрый день при Insert столкнулась с проблемой выгрузки данных. В частности с конвертацией данных.

Вопрос, можно ли избежать конвертации данных, так как в таблице много столбцов, все разных типов...
Вот что я имею:
Код
Sub DWH_Update_12()
'Выгружаем в DWH
'Производит подключение к БД и выполняет какой-либо скрипт без подключение библиотеки ACTIVEX data ojects 6.0
'
Dim cn As Object
Dim cmd As Object
Dim strSQL As String
Dim sh1 As Worksheet
Dim iRow As Long
Dim ADOErr, r

Set cn = CreateObject("ADODB.Connection")
'cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=usr;Data Source=dc1-findb01\fin;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=MP1806SV;Use Encryption for Data=False;Tag with column collation when possible=False"
 
 
On Error GoTo CnErrorHandler
cn.Open
'Явно начинаем транзакцию во избежание режима AutoCommit=ON
cn.BeginTrans
 
'Создаем команду
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = cn
'
Workbooks("Pushkin_card.xlsm").Activate
Set sh1 = ActiveWorkbook.Sheets("Встречи")
sh1.[A1].Select
Set r = ActiveCell.CurrentRegion
'
For iRow = 2 To r.Rows.Count

cmd.CommandText = "Insert into usr.supr.checkin_b(" _
& "kod,kod_prm,MR,OC,locality,adress,Open_PRM,number_of_windows_b,Format ,Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13,Col14,Col15, Col16, Col17, Col18, Col19, Col20, Col21, Col22, Col23, Col24, Col25, Col26, Col27, Col28, Col29, Col30, Col31, Col32" _
& ")Values (" _
& "convert(float,(replace('" & Cells(iRow, 1).Value & "',',','.')))," & "convert(float,(replace('" & Cells(iRow, 2).Value & "',',','.')))," '" & .Cells(iRow, 3) &, "'& "convert(datetime,(replace('" & Cells(iRow, 3).Value & "','dd.mm.yyyy','yyyy-mm-dd')),103)," & "convert(float,(replace('" & Cells(iRow, 5).Value & "',',','.'))))"
'
'MsgBox cmd.CommandText
'test = r.Cells(iRow, 2).Value
'MsgBox "Iter: " & iRow & " " & test
'
cmd.Execute
'
Next iRow
'
cn.CommitTrans
'
cn.Close
'
Exit Sub
'
CnErrorHandler:
For Each ADOErr In cn.Errors        'Отладчик ошибок подключения
    MsgBox "№ ошибки " & ADOErr.Number & Chr(10) & _
    "Описание: " & ADOErr.Description & Chr(10) & _
    "Источник: " & ADOErr.Source, vbCritical
    Debug.Print "№ ошибки " & ADOErr.Number & Chr(10) & _
    "Описание: " & ADOErr.Description & Chr(10) & _
    "Источник: " & ADOErr.Source
Next
cn.Close
Set cn = Nothing
'
End Sub
Сохранение массива на другой лист
 
New, Тест, это был просто пример, думала, что будет понятно. Спасибо, результат понятен, все работает.
Сохранение массива на другой лист
 
Вообщем, главное как выгрузить данные из массива на другой лист.
Изменено: Татьяна Басова - 06.10.2021 12:10:54
Сохранение массива на другой лист
 
Пытливый, копируем только вторую таблицу т.е. массив данных, который посчитает последнюю строку и последний столбец (это для того, чтобы не утяжелять массив). Данные пополняются, соответственно, при обновлении, мы будем брать все строки, но только последние 30 столбцов.
Сохранение массива на другой лист
 
Пытливый, на "листе1" представлена таблица 1, где 1 столбец ("Дата"). Даты там будут высчитываться формулой: "от сегодня до -30 дней назад". Соответственно будет 31 строка. Есть таблица два, она периодически обновляется и даты в названиях столбцов буду другие, столбцы будут прибавляться плюсом к прошлым столбцам, например раз в месяц. Макрос должен понимать сколько строк и столбцов копировать на другой лист (все строки и последние тридцать столбцов) (макрос выше привела, по поводу xlToLeft проверю). После того, как он понял сколько столбцов и строк сохранять, загнал их в массив и скопировал ну другой лист.  
Сохранение массива на другой лист
 
Пытливый, последний столбец

Ігор Гончаренко, без разницы как называется, пусть будет "Лист1", нужно скопировать куда-нибудь, чтобы дальше работать с этими данными
Сохранение массива на другой лист
 
Добрый день! Есть макрос, который ищет последнюю строку и последний столбец и формирует массив. Мне необходимо брать первые два столбца от данного массива и последние 30 столбцов и копировать их на другой лист.
Код
Public Sub test()

Dim I, J As Integer
Dim Vintage1() As Variant
Dim WCur As Worksheet
Dim WbN As Workbook

'формируется массив
RowCount = 0
RowCount = Cells(2, 2).End(xlDown).Row
RowColumn = Cells(2, 1).End(xlToLeft).Row
ReDim Vintage1(RowCount, 1)
For I = 1 To RowColumn - 1
For J = 1 To RowCount
Vintage1(J, I) = Cells(J + 2, I + 1).Select
Next J
Next I

'Написала примерный код для копирования на другой лист, но он не работает
'Set WbN = Workbooks.Add(xlWBATWorksheet)

'WCur.Vintage1(xlCellTypeVisible).Copy

'WbN.SaveAs ThisWorkbook.Path & "\" & IName & ".xls"
'WbN.Close SaveChanges:=True
'Next
'Application.ScreenUpdating = True

End Sub
Выгрузка данных из Excel в БД SQL с помощью VBA
 

Добрый день!

Столкнулась с сложной для меня задачей. У нас есть отчет для контроля посещения точек, который выгружается в excel из SharePoint. Сейчас при формировании отчета много ручных работ по загрузке данных в БД SQL - нужно это автоматизировать.

Примерно, как загружать данные из excel в БД SQL я понимаю, вопрос в том, что файл, содержит больше дат, чем нужно. В текущем файле даты удаляем вручную.

Нужен макрос, который будет забирать из этого файла определенные столбцы и столбцы по датам для дат от сегодня до -1 месяца назад. Полагаю, что нужно вырезать из заголовков даты и их проанализировать.

Ниже представлен примерный макрос, как я делаю выгрузку данных в хранилище БД SQL. Вопрос: как сделать так, чтобы макрос брал определенные столбца + столбцы с датами в названии от сегодня до -1 месяца назад?

Код
Sub DWH_Update_22()
'Выгружаем в DWH
'Производит подключение к БД и выполняет какой-либо скрипт без подключение библиотеки ACTIVEX data ojects 6.0
'
Dim cn As Object
Dim cmd As Object
Dim strSQL As String
Dim sh1 As Worksheet
Dim iRow As Long
Dim ADOErr, r

Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=usr;Data Source= название подключения;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=MP1806SV;Use Encryption for Data=False;Tag with column collation when possible=False"


On Error GoTo CnErrorHandler
cn.Open
'Явно начинаем транзакцию во избежание режима AutoCommit=ON
cn.BeginTrans

'Создаем команду
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = cn
'
Workbooks("Название файла из которого выгружаются данные").Activate
Set sh1 = ActiveWorkbook.Sheets("Название листа")
sh1.[A1].Select
Set r = ActiveCell.CurrentRegion
'
For iRow = 2 To r.Rows.Count

cmd.CommandText = "Insert into название таблицы в БД (" _
& "имя полей, которые выгружать" _
& ")Values (" _
& "'" & Cells(iRow, 3).Value & "'," & "'" & Cells(iRow, 4).Value & "'," & "convert(datetime,(replace('" & Cells(iRow, 5).Value & "','dd.mm.yyyy','yyyy-mm-dd')),103))"
'

cmd.Execute
'
Next iRow
'
cn.CommitTrans
'
cn.Close
'
Exit Sub
'
CnErrorHandler:
For Each ADOErr In cn.Errors        'Отладчик ошибок подключения
    MsgBox "№ ошибки " & ADOErr.Number & Chr(10) & _
    "Описание: " & ADOErr.Description & Chr(10) & _
    "Источник: " & ADOErr.Source, vbCritical
    Debug.Print "№ ошибки " & ADOErr.Number & Chr(10) & _
    "Описание: " & ADOErr.Description & Chr(10) & _
    "Источник: " & ADOErr.Source
Next
cn.Close
Set cn = Nothing
'
End Sub

Автоматическая рассылка писем из EXCEL через OUTLOOK, в массив вставляется много отступов
 
Дмитрий(The_Prist) ЩербаковОтлично, работает!!! решение найдено, спасибо!!!
Автоматическая рассылка писем из EXCEL через OUTLOOK, в массив вставляется много отступов
 
Добавила код.  
Автоматическая рассылка писем из EXCEL через OUTLOOK, в массив вставляется много отступов
 
Добрый день! Столкнулась с проблемой при написании макроса автоматической рассылки писем. Есть два листа в книге Excel. На одном в таблице располагаются 1 столбец - ФИО (директора), 2 столбец - email (директора). На другом ФИО (директора), email (директора), несколько фамилий сотрудников у каждого директора своё количество сотрудников. Макрос работает отлично, при помощи массива берем только те ФИО сотрудников со второго листа, которые принадлежат email директора с первого. Но при отправке сообщений, первому получателю (директору) вставляются все ФИО сотрудников, которые ему принадлежат и много пробелов, второму соответственно много пробелов, потом те, которые ему принадлежат. И т.д. Сорри, если сложно описала задачу, но понимаю, что он берет пустые значения, вместо ФИО сотрудников, которые ему не принадлежат, но не знаю, как починить. Изначально ФИО вставлялись просто в одну строку без запятых, теперь я добавила в код перенос на новую строку с помощью <br> и получилось вот так. Просто в одну строку точно не устраивает.
Код
Public Sub Email_dir()
Dim objOutlook As Object, objMail As Object
Dim sTo As String, sSubject As String, sBody As String, sAttachment As String, sPicture As String
Dim I, J, X As Integer
Dim Part, RowCount, Counter As Variant
Dim Vintage1(), Vintage2() As Variant
'
Workbooks.Open Filename:="X:\....xlsm"
Sheets("...").Select
RowCount = 0
End(xlDown).Row
RowCount = Cells(2, 2).End(xlDown).Row
For X = 2 To RowCount
sTo = Cells(X, 2)
'
Sheets("...").Select

RowCount = 0
End(xlDown).Row
RowCount = Cells(2, 2).End(xlDown).Row
ReDim Vintage1(RowCount, 2)
'
For I = 1 To RowCount
For J = 2 To 3
'
Vintage1(I, J - 1) = Cells(I + 1, J)
Next J
Next I
'
ReDim Vintage2(RowCount, 1)
'
For I = 1 To RowCount
If Vintage1(I, 1) = sTo Then
Vintage2(I, 1) = Vintage1(I, 2)

End If
Next I

For I = 1 To RowCount

sBody = sBody & Vintage2(I, 1) & "<br>"
Next I
'
If objOutlook Is Nothing Then
Set objOutlook = CreateObject("Outlook.Application")
End If
'
Set objOutlook = GetObject(, "Outlook.Application")
Err.Clear
Set objMail = objOutlook.CreateItem(0)
If Err.Number <> 0 Then Set objOutlook = Nothing: Set objMail = Nothing: Exit Sub
'
sSubject = ...
sPicture = "..."

With objMail
.To = sTo 
.CC = "" 
.BCC = ""
.Subject = sSubject 
.HTMLBody = sBody 

If Dir(sPicture, 16) <> "" Then
.Attachments.Add sPicture

.HTMLBody = .HTMLBody _
& "<p></p>" _
& "<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & ">" _
& "<p><i>...</i></p>"
'" height=240 width=180>" 
End If
If sAttachment <> "" Then
If Dir(sAttachment, 16) <> "" Then
.Attachments.Add sAttachment 
End If
End If
.Send 
End With
'
Set objOutlook = Nothing: Set objMail = Nothing
Application.ScreenUpdating = True
'
sBody = ""
Erase Vintage1
Erase Vintage2
Sheets("Ñîòð").Select
Next X

'
'Windows("Procedure_trigger.xlsm").Activate
'Sheets("ÄÊÖ").Select
ActiveWorkbook.Save
'
'Application.Quit
End Sub
Изменено: vikttur - 21.09.2021 10:18:10
Страницы: 1
Наверх