Показаны сообщения с ярлыком VBA. Показать все сообщения
Показаны сообщения с ярлыком VBA. Показать все сообщения

воскресенье, 9 августа 2015 г.

Macros for Excel on VBA for copy only values

You can see Macros for Excel on VBA for copy only values. Hidden rows will be copied too,  because here we are not control it, but You can add it in Your code by yuorself, if needed:


Sub CopyOnlyValuesCell()
On Error Resume Next
Dim str As String
Dim arrData() As Variant
Dim arrReturnData() As Variant
Dim rng As Excel.Range
Dim lRows As Long
Dim lCols As Long
Dim i As Long, j As Long
  lRows = Selection.Rows.Count
  lCols = Selection.Columns.Count
  ReDim arrData(1 To lRows, 1 To lCols)
  ReDim arrReturnData(1 To lRows, 1 To lCols)
  Set rng = Selection
  arrData = rng.Value
 
 If Selection.Count = 1 Then
  str = ActiveCell.Value
 Else
  For i = 1 To lRows
    For j = 1 To lCols
        If j > 1 Then
         str = str & Chr(9) & (arrData(i, j))
        Else
         str = str & arrData(i, j)
        End If
    Next j
    If i > 0 Then str = str & Chr(13) & Chr(10)
  Next i
 End If
    CopyTextToClipboard (str)
  Set rng = Nothing
End Sub

CopyTextToClipboard is our function. We can do it so:



Sub CopyTextToClipboard(ByVal inText As String)
  Dim objClipboard As Object
  Set objClipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

  objClipboard.SetText inText
  objClipboard.PutInClipboard

  Set objClipboard = Nothing
End Sub
 
 
 
Function GetTextFromClipboard() As String
  Dim objClipboard As Object
  Set objClipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

  objClipboard.GetFromClipboard
  GetTextFromClipboard = objClipboard.GetText

  Set objClipboard = Nothing
End Function


Crack the password in Excel and uprotect modules

For  2003 XLS file, using Excel 2007 and may be 2010


  1. Backup the xls file
  2. Using a HEX editor, locate the DPB=... part
  3. Change the DPB=... string to DPx=...
  4. Open the xls file in Excel
  5. Open the VBA editor (ALT+F11)
  6. Excel discovers an invalid key (DPx) and asks whether you want to continue loading the project (basically ignoring the protection)
  7. You will be able to overwrite the password, so change it to something you can remember
  8. Save the xls file*
  9. Close and reopen the document.


If you are using a .xls You can open:

  1. Create a new simple excel file.
  2. In the VBA part, set a simple password (say - 1234).
  3. Save the file and exit. Then check the file size - see Stewbob's gotcha
  4. Open the file you just created with a hex editor.
  5. Copy the lines starting with the following keys:


  6. CMG=....
    DPB=...
    GC=...
    FIRST BACKUP the excel file you don't know the VBA password for, then open it with your hex editor, and paste the above copied lines from the dummy file.


  7. Save the excel file and exit.
  8. Now, open the excel file you need to see the VBA code in. The password for the VBA code will simply be 1234 (as in the example I'm showing here).

VBA method:


`code credited to Siwtom (nick name), a vietnamese develope
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
        ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
        ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function
Public Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As Long
    Dim OriginProtect As Long
    Hook = False
    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")

    If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
        If TmpBytes(0) <> &H68 Then
            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
            p = GetPtr(AddressOf MyDialogBoxParam)
            HookBytes(0) = &H68
            MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
            HookBytes(5) = &HC3
            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
            Flag = True
            Hook = True
        End If
    End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                           hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function


And call it:

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub



For Unprotect worksheet in Excel:


Sub PasswordRemove()
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "«Password» removed " & (i) & (j) & (k) & (l) & (m) & (i1) & (i2) & (i3) & (i4) & (i5) & (i6) & (n)
ActiveWorkbook.Sheets(1).Select
' Range("da1").FormulaR1C1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub


воскресенье, 20 июля 2014 г.

Send mail by Outlook with VBS


Send mail by Outlook with VBS

Create this file.vbs with next code:


Dim ToAddress
Dim FromAddress
Dim MessageSubject
Dim MyTime
Dim MessageBody
Dim MessageAttachment
Dim ol, ns, newMail
MyTime = Now

ToAddress = "Dmitry@example.org"
MessageSubject = "It works!."
MessageBody = "Good job on that script." 
' MessageAttachment = some attachment
Set ol = WScript.CreateObject("Outlook.Application")
Set ns = ol.getNamespace("MAPI")
Set newMail = ol.CreateItem(olMailItem)
newMail.CC = ToAddress
newMail.Subject = MessageSubject
newMail.Body = MessageBody & vbCrLf & MyTime
newMail.RecipIents.Add(ToAddress)
' newMail.Attachments.Add(MessageAttachment)
newMail.Send




VBS script of taskkill with log in txt


VBS script of taskkill with log in txt 





Dim objFS, objFile, WshShell, intTemp, arrProcs, i
Const ForAppending = 8
 
arrProcs = Array("winword.exe", "excel.exe", "access.exe")
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFile = objFS.OpenTextFile("C:\CTM_killer_log.txt", ForAppending, True)
objFile.WriteLine Now
Set WshShell = WScript.CreateObject("WScript.Shell")
For i = 0 To Ubound(arrProcs)
    intTemp = WshShell.Run("taskkill /f /IM " & arrProcs(i), 0, True)
    If intTemp = 0 Then
        objFile.WriteLine "Процесс " & UCase(arrProcs(i)) & " завершён успешно."
    Else
        objFile.WriteLine "Процесс " & UCase(arrProcs(i)) & " не завершён. Код ошибки: " & intTemp & "."
    End If
Next
objFile.Close
Set objFile = Nothing
Set objFS = Nothing
WSCript.Echo "Задание по завершению процессов обработано." & vbNewLine & "Файл журнала: C:\CTM_killer_log.txt"
WScript.Quit 0



вторник, 8 июля 2014 г.

Скопировать файлы за вчерашний день в другую папку на VB

Скопировать файлы созданные/измененные за вчерашний день в другую папку на Visual Basic



dim fso,f,file,files,source,destination
dim ago
dim sdata
ago=date-1
set fso=createobject("scripting.filesystemobject")
source="C:\chsnippets"
destination="c:\temp\"
set f=fso.getfolder(source)
set files=f.files
for each file in files
sdata=file.datelastmodified
REM MsgBox "This is " & left(sdata,10) & " with "  & left(ago,10)
if left(ago,10) = left(sdata,10) then
fso.copyfile file, destination,true
end if
next


среда, 8 января 2014 г.

ID3v1 теги в mp3 файлах, получить всю информацию о треке на VBA


ID3v1 теги в mp3 файлах, получить всю информацию о треке на VBA 


Sub CreateReport_Mp3FileProperties()
    Dim iFileName$, iPath$, iRow&, iColumn&
    Dim iFolder As Object, iMp3File As Object
     
    iPath = "B:\Muzic Hits\": iRow = 2
 
    Set iFolder = CreateObject("Shell.Application").Namespace(CVar(iPath))
    If Not iFolder Is Nothing Then
       iFileName = Dir(iPath & "*.mp3")
       If iFileName <> "" Then
          Workbooks.Add xlWBATWorksheet
          Application.ScreenUpdating = False
          Do
               Application.StatusBar = iFileName
               Set iMp3File = iFolder.ParseName(iFileName)
               For iColumn = 0 To 50 '
                   Cells(iRow, iColumn + 1) = iFolder.GetDetailsOf(iMp3File, iColumn)
               Next
               iFileName = Dir
               iRow = iRow + 1
          Loop While iFileName <> ""
          For iColumn = 0 To 50 ' Headers Report
              Cells(1, iColumn + 1) = iFolder.GetDetailsOf(iFolder.Items, iColumn)
          Next
          Application.StatusBar = False
          Application.ScreenUpdating = True
       Else
          MsgBox "No files .mp3", , ""
       End If
    Else
       MsgBox "Folder is not found", , ""
    End If
End Sub

вторник, 10 декабря 2013 г.

VBA and MS Word: count dublicates

VBA - Подсчет повторов в файле Word

Имеем вордовский документ с набором одинаковых строчек, уже отсортированных по-алфавиту. Нужно убрать повторения, оставив уникальные строчки и дописав к ним сколько их было изначально:

Sub WordCounter()
   s = ""
   For u = 1 To ActiveDocument.Paragraphs(1).Range.Characters.Count - 1
      s = s + ActiveDocument.Paragraphs(1).Range.Characters(u)
   Next u
   j = 0
   k = 1
   For i = 1 To ActiveDocument.Paragraphs.Count
      f = ""
      For u = 1 To ActiveDocument.Paragraphs(i).Range.Characters.Count - 1
         f = f + ActiveDocument.Paragraphs(i).Range.Characters(u)
      Next u
      If s = f Then
         j = j + 1
      Else
         ActiveDocument.Paragraphs(k).Range.Select
         Selection.TypeText (s + Str(j))
         j = 1
         s = ""
         For u = 1 To ActiveDocument.Paragraphs(i).Range.Characters.Count - 1
            s = s + ActiveDocument.Paragraphs(i).Range.Characters(u)
         Next u
         k = k + 1
      End If
   Next i
   ActiveDocument.Paragraphs(k).Range.Select
   Selection.TypeText (s + Str(j))
   For i = ActiveDocument.Paragraphs.Count To k + 1 Step -1
         ActiveDocument.Paragraphs(i).Range.Select
         Selection.TypeBackspace
   Next i
End Sub


среда, 20 ноября 2013 г.

WinRAR archive copy from Access VBA to Excel/Word


Процедура архивирования экспортируемого файла из Access в Excel/Word  etc.


Sub SaveCopy()
Dim Wb As Workbook
Dim wbName, Today, WinRarApp$, iPath$, iFileName$, iFileNameRar$, Adr, RetVal
'каждый день сохраняет копию файла со вчерашней датой, производит архивацию этой копии и удаляет файл *.xls, оставляя только архив *.rar
    On Error GoTo ErrorHandler
    If MsgBox("Сохранить резервную копию файла?", vbOKCancel + vbQuestion, "Архив") = vbCancel Then Exit Sub
    Set Wb = ActiveWorkbook
    wbName = Wb.Name
    Today = Format(CStr(Date), "yyyy/mm/dd")
    iPath$ = "\"
    iFileName$ = Left(wbName, Len(wbName) - 4) + "_" + Today + ".xls"
    'Путь и название архива
    iFileNameRar$ = iPath$ + Left(iFileName$, Len(iFileName$) - 3) + "rar"
    'для проверки существования такого же файла
    If Dir(iPath$ + iFileName$) <> "" Or Dir(iFileNameRar$) <> "" Then
        MsgBox "Копия файла c датой " & Today & " в директории " & Chr(13) & iPath$ & " уже существует!", vbExclamation
        Exit Sub
    End If
    'сохранение копии файла с добавлением вчерашней даты
    Wb.SaveCopyAs (iPath$ + iFileName$)
    iFileName$ = iPath$ + iFileName$
    WinRarApp$ = "C:\Program Files\WinRAR\WinRAR.exe a -ep -df " '- ep -исключить пути из имён; -df - удалить файлы после архивации
    Adr = WinRarApp$ & " """ & iFileNameRar$ & """ """ & iFileName$ & """ " 'добавляем кавычки, чтобы можно было было иметь пробелы в названии файла
    RetVal = Shell(Adr, vbHide)
    MsgBox "Копия файла c датой " & Today & " сохранена и заархивирована!" & Chr(13) & "По адресу: " & iPath$, vbInformation, "Архивация данных"
    Exit Sub
ErrorHandler:
    MsgBox "При сохранении копии файла произошла ошибка!" & vbCrLf & "Описание: " & Err.Description & vbCrLf & "Номер: " & Err.Number, vbExclamation, "Ошибка"
End Sub

' вызов в теле процедуры:   SaveCopy (без Call)
' сохраняет файлы на диск C 

понедельник, 18 ноября 2013 г.

Export from Access with MySQL to Excel posts


Создаем самый главный наш скрипт экспорта из Access + MySQL в Excel в отдельном в модуле



'модуль формирования сводной таблицы по проекту
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
Dim cnn As New ADODB.Connection
Const MySQLConnectString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
Dim rs As New ADODB.Recordset 'объект набора данных
Dim cmd As ADODB.Command
Dim EA As Excel.Application 'объект приложения Excel
Dim i As Integer, j, MyVal As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Справка.xlt" 'относительный путь к шаблону
Dim sq, Представление As String

   
Sub new1(Представление As String)
On Error Resume Next
    Set EA = CreateObject("Excel.Application") 'запускаем Excel
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Шаблон 'открываем шаблон
    EA.Cells.Select 'выделить все
    EA.Selection.Clear 'очистить
    'EA.Selection.NumberFormat = "@"  ' 0;-0;;@
    EA.Selection.NumberFormat = "0;-0;;@" ' формат: 0 - не показывать
   
   
Set cmd = New ADODB.Command
With cmd
.CommandTimeout = 60
End With
cnn.ConnectionString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
cnn.Open
sq = "SELECT * FROM db_name." & Представление

With rs
.ActiveConnection = cnn
.CursorType = adOpenDynamic
.CursorLocation = adUseClient
.Open sq
End With

'rs.Open Представление, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
   
    ReDim DA(0 To 0, 0 To rs.Fields.Count - 1) 'выделяем память для заголовка таблицы
    For j = 0 To rs.Fields.Count - 1 'перебираем все поля функции
        DA(0, j) = rs.Fields(j).Name 'заносим имена полей в массив
    Next j
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Formula = DA 'выводим шапку таблицы
    Erase DA 'очищаем массив, освобождаем память
   
    rs.MoveLast 'переходим в конец для подсчёта количества строк в наборе данных
    ReDim DA(0 To rs.RecordCount - 1, 0 To rs.Fields.Count - 1) 'выделяем память для данных таблицы
    rs.MoveFirst 'возвращаемся в начало
    i = 0 'инициализируем счётчик строк
    Do While Not rs.EOF ' перебираем строки
        For j = 0 To rs.Fields.Count - 1 'перебираем поля
            DA(i, j) = rs(j) 'заносим данные в массив
        Next j
        rs.MoveNext 'читаем следующую строку набора данных
        i = i + 1 ' увеличить порядковый месяц
    Loop
    'выводим массив в таблицу
    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(rs.RecordCount, rs.Fields.Count - 1)).Formula = DA
    'выводим массив в таблицу
    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(rs.RecordCount, rs.Fields.Count - 1)).Formula = DA
        'фомат шапки таблицы
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).ColumnWidth = 10 'ширина всех колонок
    EA.Columns("A:A").ColumnWidth = 21 'ширина 1-ой колонки
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.Name = "Times New Roman"  'устанавливаем шрифт
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.Size = 10  'устанавливаем размер шрифта
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Font.FontStyle = "Bold"
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).WrapText = True 'перенос текста
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).VerticalAlignment = xlTop 'выравнивание по высоте - верх
    'обрисуем границы
    EA.Range(EA.ActiveCell.Offset(i, rs.Fields.Count - 1), EA.ActiveCell.Offset(0, 0)).Borders(xlEdgeTop).Weight = xlThin  'подчёркиваем строку
    EA.Range(EA.ActiveCell.Offset(i, 0), EA.ActiveCell.Offset(0, 0)).Borders(xlEdgeBottom).Weight = xlThin  'подчёркиваем строку
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count)).Borders(xlInsideVertical).Weight = xlThin   ' чертим внутреннюю вертикаль
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count - 1)).Borders(xlEdgeLeft).Weight = xlThin  ' чертится линия слева
    EA.Range(EA.ActiveCell, EA.ActiveCell.Offset(i, rs.Fields.Count - 1)).Borders(xlInsideHorizontal).Weight = xlThin  ' чертим внутреннюю горизонталь
    EA.Range(EA.ActiveCell.Offset(i, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Borders(xlEdgeBottom).Weight = xlThin  'подчёркиваем строку
   
     EA.Cells.Select 'выделить все
     EA.Selection.Columns.AutoFit
     EA.Columns("D:D").ColumnWidth = 10
   
    'зафиксировать панель
    ' EA.Rows("1:1").Select
    ' EA.ActiveWindow.FreezePanes = True
   
    'сохраняем документ
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & "_справка", xlExcel8, , , , , , True
   
    EA.Visible = True 'делаем Excel видимым
    Set EA = Nothing 'очищаем переменную и отключаемся от Excel
' --
    rs.Close 'закрываем набор данных
    Set rs = Nothing 'освобождаем память
 
'Set prm = Nothing
Set cmd = Nothing
'cnn.Close
Set cnn = Nothing
End Sub


Да, и не забудьте кнопку:


Private Sub Кнопка7_Click()
new1 (List5.Value)
End Sub




MYSQL and ACCESS with VBA

Для автоматизации данных из сайта можно попробовать настроить отдельную учетную запись в PHPmyAdmin, создать внутри новой базы запросы на нужную нам базу и открыть внешнее соединение.

Соединение с базой данных MySQL через Access на VBA предварительно установив ODBC драйвер для MySQL и настроив DSN - соединение в ODBC настройках.


В самом начале как обычно пишем:

Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
 Объявляем глобальные переменные, которые могут понадобиться
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset 'объект набора данных

Dim i As Integer, j As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Шаблоны\Справка.xlt" 'относительный путь к шаблону
Dim sq As String
Dim b As Boolean

Заполняем листбокс перечнем таблиц из базы данных при загрузке формы

Private Sub Form_Load()
con.ConnectionString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
con.Open
Set rs = New ADODB.Recordset
sq = "SHOW FULL TABLES IN   `db_name` "
With rs
.ActiveConnection = con
.CursorType = adOpenDynamic
.CursorLocation = adUseClient
.Open sq
End With
' Combo1.RowSourceType = query
rs.MoveFirst
While Not rs.EOF
List5.AddItem (rs(0))
' Combo1.AddItem (rs(0))
' Combo1.RowSource = rs("Tables_in_db_name")
' MsgBox rs("Tables_in_db_name")
rs.MoveNext
Wend
'   Application.DoCmd.OpenQuery " select * from db_name.vote_track"    
End Sub

' Заполняем комбобокс:

Private Sub Кнопка0_Click()
Dim ConnectionMySQL As New ADODB.Connection
Const MySQL_ConnectString = "DSN=domen.net;SERVER=domen.net;UID=login;PORT=3306"
Dim RecordsetMySQL As New ADODB.Recordset 'объект набора данных
Set ConnectionMySQL = CreateObject("ADODB.Connection") ' Create connection object
ConnectionMySQL.CursorLocation = 2 ' Use client type cursor
ConnectionMySQL.Open MySQL_ConnectString, "", "", -1 ' Connect to the database
Set RecordsetMySQL = CreateObject("ADODB.Recordset")
RecordsetMySQL.Open "SHOW FULL TABLES IN   `db_name`", ConnectionMySQL, 2, 3, 1
Do While Not RecordsetMySQL.EOF ' Do Until RecordsetMySQL.EOF
' WScript.Echo RecordsetMySQL.Fields(0)
' MsgBox RecordsetMySQL.Fields(0)
  Combo1.AddItem RecordsetMySQL!Tables_in_db_name
 RecordsetMySQL.MoveNext
Loop
RecordsetMySQL.Close
ConnectionMySQL.Close
End Sub


Строку соединения можно написать напрямую  - не создавая  настроек DSN соединения в ODBC настройках.

Const ServerName As String = "m.net"
Const User_ID  As String = "rgrgr"
Const Database_Name As String = "rgrgr"
Const Password  As String = "gfgf"
Const MySQL_ConnectString = "Driver={MySQL ODBC 5.2 ANSI Driver};Server=" & ServerName & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"







воскресенье, 29 сентября 2013 г.

VBA MS Access log users


Ведение логов посещения приложения в MS Access через VBA

Необходимо создать две таблицы - Пользователи и Журнал

'Модуль функций
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные

'внешняя функция определения логина текущего пользователя компьютера
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

'внешняя функция определения имени текущего компьютера
Private Declare Function apiGetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

'функция определения логина текущего пользователя компьютера
Function ТекущийПользователь() As String
Dim Результат As Long 'код возврата внешней функции
Dim ДлинаИмени 'длина имени пользователя
Dim ИмяПользователя As String 'имя пользователя
    ИмяПользователя = String(254, 0) 'заполняем строку имени пользователя нулями
    ДлинаИмени = 255 'устанавливаем начальную длину имени
    Результат = apiGetUserName(ИмяПользователя, ДлинаИмени) 'запрашиваем значение
    If Результат <> 0 Then
        ТекущийПользователь = Left(ИмяПользователя, ДлинаИмени - 1)
    Else
        ТекущийПользователь = ""
    End If
End Function

'функция определения имени текущего компьютера
Function ТекущийКомпьютер() As String
Dim Результат As Long 'код возврата внешней функции
Dim ДлинаИмени 'длина имени пользователя
Dim ИмяКомпьютера As String 'имя пользователя
    ДлинаИмени = 16
    ИмяКомпьютера = String(ДлинаИмени, 0)
    Результат = apiGetComputerName(ИмяКомпьютера, ДлинаИмени)
    If Результат <> 0 Then
        ТекущийКомпьютер = Left(ИмяКомпьютера, ДлинаИмени)
    Else
        ТекущийКомпьютер = ""
    End If
End Function




Private Sub Form_Open(Cancel As Integer)
Dim RS As Recordset
    Set RS = CurrentDb.OpenRecordset("Журнал", dbOpenTable)
    RS.Index = "PrimaryKey"
    RS.Seek "=", ТекущийПользователь(), ТекущийКомпьютер()
    If RS.NoMatch Then
        RS.AddNew
        RS!Пользователь = ТекущийПользователь()
        RS!Компьютер = ТекущийКомпьютер()
        RS!Вход = Now()
        RS!Выход = Null
        RS!Счётчик = 1
        RS.Update
    Else
        RS.Edit
        RS!Вход = Now()
        RS!Выход = Null
        RS!Счётчик = RS!Счётчик + 1
        RS.Update
    End If
    Set RS = Nothing
End Sub





Private Sub Form_Close()
Dim RS As Recordset
    Set RS = CurrentDb.OpenRecordset("Журнал", dbOpenTable)
    RS.Index = "PrimaryKey"
    RS.Seek "=", ТекущийПользователь(), ТекущийКомпьютер()
    If RS.NoMatch Then
        RS.AddNew
        RS!Пользователь = ТекущийПользователь()
        RS!Компьютер = ТекущийКомпьютер()
        RS!Вход = Null
        RS!Выход = Now()
        RS!Счётчик = 1
        RS.Update
    Else
        RS.Edit
        RS!Выход = Now()
        RS.Update
    End If
    Set RS = Nothing
End Sub

MSSQL and VBA - automatic mail sender auto-created Excel file


Вариант отправки автоматической справки из MS SQL посредством VBA


'модуль формирования сводной таблицы по проекту
Option Compare Database 'сортировка символов определяется базой данных
Option Explicit 'запретить не объявленные переменные
Dim RS As New ADODB.Recordset 'объект набора данных
Dim EA As Excel.Application 'объект приложения Excel
Dim i As Integer, j, MyVal As Integer 'счетчики
Dim DA 'динамический массив для вывода данных
Const Шаблон As String = "\Шаблоны\Справка.xlt" 'относительный путь к шаблону
 Const emails As String = "grrg@mail.org; tgrta@mail.org; grtgtrv@mail.org; rgtn@mail.org"
 Dim e As Variant
 Dim FileAttachment As String
 Dim FileAttachmentTwo As String
 Dim Проект, Продукт, Имя, Представление As String

Sub ХодТПП()
   Проект = "КакойтоПроект"
   Продукт = "%"
   Представление = "SELECT Отчет.* " & _
   " FROM dbo.Отчет('" & Проект & "', '" & Продукт & "') Отчет"
    Set EA = CreateObject("Excel.Application") 'запускаем Excel
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Шаблон 'открываем шаблон
    EA.Goto "дата" 'переходим к метке подзаголовка
    EA.ActiveCell.Formula = EA.ActiveCell.Formula & " по состоянию на " & Date & " " & Time 'выводим текущую дату и время
    EA.Goto "таблица" 'переходим к метке таблицы
    'Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    With cmd
    .CommandTimeout = 60
    End With
    RS.Open Представление, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
    'rs.Open Представление, cmd.ActiveConnection
    ReDim DA(0 To 0, 0 To RS.Fields.Count - 1) 'выделяем память для заголовка таблицы
    For j = 0 To RS.Fields.Count - 1 'перебираем все поля функции
        DA(0, j) = RS.Fields(j).Name 'заносим имена полей в массив
    Next j
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, RS.Fields.Count - 1)).Formula = DA 'выводим шапку таблицы
    Erase DA 'очищаем массив, освобождаем память
    RS.MoveLast 'переходим в конец для подсчёта количества строк в наборе данных
    ReDim DA(0 To RS.RecordCount - 1, 0 To RS.Fields.Count - 1) 'выделяем память для данных таблицы
    RS.MoveFirst 'возвращаемся в начало
    i = 0 'инициализируем счётчик строк
    Do While Not RS.EOF ' перебираем строки
        For j = 0 To RS.Fields.Count - 1 'перебираем поля
            DA(i, j) = RS(j) 'заносим данные в массив
        Next j
        RS.MoveNext 'читаем следующую строку набора данных
        i = i + 1 ' увеличить порядковый месяц
    Loop
    'выводим массив в таблицу
    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(RS.RecordCount, RS.Fields.Count - 1)).Formula = DA
    RS.Close 'закрываем набор данных
    Set RS = Nothing 'освобождаем память
    EA.Goto "дата" 'переходим к метке подзаголовка
    'EA.ActiveCell.Formula = EA.ActiveCell.Formula & " по состоянию на " & Date & " " & Time 'выводим текущую дату и время
    Имя = Replace(Проект, "]", "")
    Имя = Replace(Проект, "[", "")
    Имя = Replace(Проект, "_", " ")
    Имя = Replace(Проект, "/", " ")
    Имя = Replace(Проект, "%", "")
    If Len(Имя) > 0 Then EA.ActiveCell.Offset(-1, 0).Formula = EA.ActiveCell.Offset(-1, 0).Formula & " по проекту " & Имя
    If Продукт <> "%" Then EA.ActiveCell.Offset(-1, 0).Formula = EA.ActiveCell.Offset(-1, 0).Formula & " по продукту " & Продукт
    'сохраняем документ
    EA.ActiveWorkbook.CheckCompatibility = False
    EA.DisplayAlerts = False
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "=Отчет_" & Имя & " " & Replace(Продукт, "%", ""), xlExcel8, , , , , , True
    EA.Visible = True 'делаем Excel видимым
    EA.DisplayAlerts = True
    EA.Application.Quit
    Set EA = Nothing 'очищаем переменную и отключаемся от Excel
    Set cmd = Nothing
    FileAttachmentTwo = Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "=справка_" & Имя & " " & Replace(Продукт, "%", "") & ".xls"
     
     
 
    e = SendEMail(emails, "Тема сообщения", "См. вложение" & Chr(13) & Chr(13) & "С уважением, " & Chr(13) & "Друг семьи  " & Chr(13) & "Тел.  такой то", FileAttachment & "," & FileAttachmentTwo)
End Sub

Public Function SendEMail(MailTo As String, Subjectline As String, MyBodyText As String, MyAttachment As String)
Dim MyOutlook As Outlook.Application
Dim MyMail As Outlook.MailItem
Dim BodyFile As String
Dim SplitFiles
'Subjectline$ = "TEMA"
'MyBodyText = "It is auto-letter"
Set MyOutlook = New Outlook.Application
Set MyMail = MyOutlook.CreateItem(olMailItem)
MyMail.To = MailTo
MyMail.Subject = Subjectline$
MyMail.Body = MyBodyText
'MyMail.CC = "site@mail.org"
MyMail.BCC = "site@mail.org"
SplitFiles = Split(MyAttachment, ",")
If Len(MyAttachment) > 0 Then MyMail.Attachments.Add Trim(SplitFiles(0))
'If Len(MyAttachment) > 0 Then MyMail.Attachments.Add Trim(SplitFiles(1)) ' можно присоединить еще один сформированный файл
'MyMail.Attachments.Add "C:\somefile.xls"
'With MItem
'    .To = "test@email.com"
'    .Subject = "Commission check for future contracts"
'    .Body = Msg
'    .Attachments.Add "C:\My Documents\sample.xls"
'    .send
'End With
MyMail.send
Set MyMail = Nothing
Set MyOutlook = Nothing
End Function








пятница, 27 сентября 2013 г.

VBA Корректировка значений ячеек

VBA Корректировка значений ячеек

Заменить нули на пустые значения в выделенном диапазоне


Public Sub X2()
    Dim cel As Range
 
    On Error Resume Next
 
    For Each cel In Selection
        If cel.Value = 0 Then
            cel.Value = ""
        End If
    Next cel
End Sub


Поправить значения в столбце на текстовые значения

Sub m_1()
Dim oCell As Range
Dim LastRow As Long
Dim Colmn As String
Colmn = "c"
Columns(Colmn).NumberFormat = "@"
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In Range(Colmn & "1:" & Colmn & LastRow)
    oCell.Errors(xlNumberAsText).Ignore = True
    oCell.FormulaR1C1Local = oCell.FormulaLocal
    ' oCell.FormulaR1C1Local = Replace(oCell.FormulaLocal, ",", ".") ' заменить запятую точкой
Next oCell
End Sub




четверг, 26 сентября 2013 г.

VBA cells auto-increment


Простановка нумерации и обрисовка границ в ячейках по первому столбцу:


Sub m_1()
Dim oCell As Range
Dim LastRow As Long
Dim i As Integer
Columns("A").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove ' добавить новую колонку
Columns("A").NumberFormat = "General"
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
For Each oCell In Range("A3:" & "A" & LastRow)
    oCell.Errors(xlNumberAsText).Ignore = True
    i = i + 1
    oCell.FormulaR1C1Local = i
    Range(oCell, oCell).Borders(xlInsideVertical).Weight = xlThin
    Range(oCell, oCell).Borders(xlEdgeLeft).Weight = xlThin
    Range(oCell, oCell).Borders(xlInsideHorizontal).Weight = xlThin
    Range(oCell, oCell.Offset(0, 0)).Borders(xlEdgeBottom).Weight = xlThin
Next oCell
End Sub


VBA merge cells

VBA объединение ячеек


Sub test()
' объединяет ячейки содинаковыми значениями на странице в указанном столбце
Dim RowIndex As Long
Dim StartRow As Long
Dim LastRow As Long
Dim ColumnToMerge As Long
Dim countHPageBreak As Long
Dim hPB As HPageBreak
Dim pageLastRow() As Variant
Dim i As Long, ihPB As Long
Dim flag As Boolean
   
   
    StartRow = 2 ' с какой строки начинать
    ColumnToMerge = 2 ' в какой колонке объединять
    flag = True  ' учитывать ли значения слева False - нет, True - да
    countHPageBreak = ActiveSheet.HPageBreaks.Count
   
    ReDim pageLastRow(countHPageBreak) As Variant
   
    i = 0
    For Each hPB In ActiveSheet.HPageBreaks
     pageLastRow(i) = hPB.Location.Row - 1
     i = i + 1
    Next hPB
    pageLastRow(countHPageBreak) = Cells(Rows.Count, ColumnToMerge).End(xlUp).Row
   
   
   
    Application.DisplayAlerts = False
    For ihPB = 0 To countHPageBreak
       
        For RowIndex = StartRow + 1 To pageLastRow(ihPB)
           
            With Cells(RowIndex, ColumnToMerge)
               
                If .Value = .Offset(-1, 0).MergeArea.Cells(1).Value Then
                  If flag Then
                     If .Offset(0, -1).MergeArea(1).Value = .Offset(-1, -1).MergeArea(1).Value Then  '.Offset(0, -1).MergeArea.Address <> .Offset(-1, -1).MergeArea.Address Then
                         Range(Cells(RowIndex, ColumnToMerge), .Offset(-1, 0)).Merge
                     End If
                   Else
                  Range(Cells(RowIndex, ColumnToMerge), .Offset(-1, 0)).Merge
                  End If
                End If
         
            End With
           
           
        Next RowIndex
       
        StartRow = pageLastRow(ihPB) + 1
    Next ihPB
    Application.DisplayAlerts = True
End Sub



LDAP catalog VBA parser

С помощью VBA можно посмотреть информацию и контакты в сети пользователей:

Function GetADInfo(ByVal SearchField, ByVal SearchString, ByVal ReturnField)

' Указываем  имя домена ("dc=domain, dc=local")
Dim adoCommand, strDomain, objConnection

strDomain = "dc=winitpro,dc=ru"

Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

' Подключаемся
Set adoCommand = CreateObject("ADODB.Command")
adoCommand.ActiveConnection = objConnection

' Рекурсивный поиск по AD, начиная с корня домена
adoCommand.CommandText = _
 "<LDAP://" & strDomain & ">;(&(objectCategory=" & "User" & ")" & _
 "(" & SearchField & "=" & SearchString & "));" & SearchField & "," & ReturnField & ";subtree"

' создаем набор записей RecordSet
Dim objRecordSet
Set objRecordSet = adoCommand.Execute

If objRecordSet.RecordCount = 0 Then
GetADInfo = "not found"  ' ничего не найдено
Else
GetADInfo = objRecordSet.Fields(ReturnField) ' возвращаемое значение
End If

' Закрываем подключение
objConnection.Close

' Очищаем переменные
Set objRecordSet = Nothing
Set objCommand = Nothing
Set objConnection = Nothing

End Function



Ячейка B2 (наименование организации):
=GetADInfo("samAccountName";A2; "Company")
Ячейка C2 (CN):
=GetADInfo("samAccountName";A2; "distinguishedName")
также вместо "Company" можно подставить "name" чтобы получить учетку или "mail" чтобы получить почтовый ящик пользователя
ОБЯЗАТЕЛЬНО чтобы эта бяка работала надо в References добавить  Microsoft VBScript Regular Expressions 5.5

Visual basic MS Access ADODB example loop

Visual basic MS Access ADODB example loop



Option Compare Database
Option Explicit
Dim rs As New ADODB.Recordset
Dim EA As Excel.Application
Dim i As Integer, j, MyVal As Integer
Dim DA
Const Shablon As String = "\Path\Shablon.xlt"
Dim Zapros As String


Sub Something(view As String)
    Set EA = CreateObject("Excel.Application")
    EA.Workbooks.Add Template:=Application.CurrentProject.Path & Shablon
view = "SELECT * FROM " & view
rs.Open view, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText

    ReDim DA(0 To 0, 0 To rs.Fields.Count - 1)
    For j = 0 To rs.Fields.Count - 1
        DA(0, j) = rs.Fields(j).Name
    Next j
    EA.Range(EA.ActiveCell.Offset(0, 0), EA.ActiveCell.Offset(0, rs.Fields.Count - 1)).Formula = DA
    Erase DA
    rs.MoveLast
    ReDim DA(0 To rs.RecordCount - 1, 0 To rs.Fields.Count - 1)
    rs.MoveFirst
    i = 0
    Do While Not rs.EOF
        For j = 0 To rs.Fields.Count - 1
            DA(i, j) = rs(j)
        Next j
        rs.MoveNext
        i = i + 1
    Loop

    EA.Range(EA.ActiveCell.Offset(1, 0), EA.ActiveCell.Offset(rs.RecordCount, rs.Fields.Count - 1)).Formula = DA
    rs.Close
    Set rs = Nothing
    Zapros = Replace(Zapros, "]", "")
    Zapros = Replace(Zapros, "[", "")
    EA.ActiveWorkbook.SaveAs Application.CurrentProject.Path & "\" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "_" & Zapros & "_file", xlExcel8, , , , , , True

    EA.Visible = True
    Set EA = Nothing
    End Sub





Private Sub button1_Click()
Dim i As Integer
Dim Imya  As String
Dim LB As ListBox
    Set LB = Me!Listbox1
    If LB.ListIndex < 0 Then
        Imya  = ""
        Exit Sub
    Else
        Imya  = Nz(LB)
    End If
    Set LB = Nothing
   
    Application.DoCmd.OpenForm
   ' Form_Listform.Repaint  
   ' If os = "Windows XP" Then Application.DoCmd.RepaintObject acForm, "Loading"
    Application.DoCmd.RepaintObject acForm, "Loading"
    Application.DoCmd.Hourglass True
     Something("[" & Imya  & "]")
    'Application.DoCmd.Close acForm, "Listform", acSaveYes
    Application.DoCmd.Hourglass False
   
    Application.DoCmd.Close acForm, "Loading", acSaveYes
    Application.DoCmd.RunCommand acCmdAppMinimize
End Sub















воскресенье, 1 сентября 2013 г.

Excel + VBA » Объединение файлов


Как объединить несколько файлов Excel в один? С помощью VBA:


Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xls), *.xls", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open Filename:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Постоянные читатели

Популярные сообщения