MALICIOUS
218
Risk Score
Malware Insights
MITRE ATT&CK
T1059.005 Visual Basic
T1059.003 Windows Command Shell
T1105 Ingress Tool Transfer
This Excel document contains a Workbook_Open macro that utilizes WScript.Shell and cmd.exe to execute arbitrary commands. The macro also contains API calls to wininet.dll, suggesting it attempts to download and execute a second-stage payload from the embedded URL http://belov/sw/FormReciveData.aspx. The presence of these indicators strongly suggests a malicious macro downloader.
Heuristics 8
-
VBA project inside OOXML medium 5 related findings OOXML_VBADocument contains a VBA project — VBA macros present
-
WScript.Shell usage critical OLE_VBA_WSCRIPTWScript.Shell usageMatched line in script
'access Windows scripting Set myWS = CreateObject("WScript.Shell") 'read key from registry -
CreateObject call high OLE_VBA_CREATEOBJCreateObject callMatched line in script
postData = "nii" + Chr(13) + "" + Chr(13) + "0" + Chr(13) + "строка1" + Chr(13) + "строка2" Set oServerXMLHTTP = CreateObject("Msxml2.ServerXMLHTTP") With oServerXMLHTTP -
cmd.exe reference in VBA high OLE_VBA_CMDcmd.exe reference in VBAMatched line in script
cmd.Execute 'Все закрываем -
VBA p-code auto-exec with execution tokens high OLE_VBA_PCODE_AUTOEXEC_EXECCompiled VBA/cache stream contains an auto-execution token together with shell/download/object-execution tokens. This catches p-code-only or source-extraction-failure macro documents where visible source is unavailable.
-
Workbook_Open macro low OLE_VBA_WBOPENWorkbook_Open macroMatched line in script
Attribute VB_Customizable = True Private Sub Workbook_Open() -
Hidden worksheet (hidden) low OOXML_HIDDEN_SHEETExcel workbook contains 1 hidden sheet(s) — hidden sheets are commonly used to conceal macro code, staging data, or intermediate payload construction
-
Embedded URL info EMBEDDED_URLOne or more URLs were extracted from the document. The URL itself is not a detection — see the per-URL labels for which channel (macro, JS, link annotation, document body, ...) reached each URL.URL http://belov/sw/FormReciveData.aspx In document text (OOXML body / shared strings)
Extracted artifacts 19
Files carved from inside the sample during analysis.
| Filename | Kind | Source | Size |
|---|---|---|---|
macros.bas |
vba-macro | oletools.olevba.extract_macros (decoded VBA source from OOXML) | 64251 bytes |
SHA-256: cdeff6380b49d80a0542a0621984d955b6770b8fa21cf6338a240343978c4d00 |
|||
Preview scriptFirst 1,000 lines of the extracted script
Attribute VB_Name = "ЭтаКнига"
Attribute VB_Base = "0{00020819-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True
Private Sub Workbook_Open()
End Sub
Attribute VB_Name = "Лист1"
Attribute VB_Base = "0{00020820-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True
Attribute VB_Name = "Module1"
Option Explicit
Public gpaNastrForm As Variant, gpRowNastr As Integer, gpColNastr As Integer
Const cVer = "1.0", colKodForm = "A", colLeftF = "C", colRightF = "D", colResultF = "E", colFormulaHum = "B", _
xFORMA = 1, yFORMA = 1, xAtr = 4, xTable = 7, yTable = 1, xCol = 15, yCol = 1, xyFormatHead = "A25", xyFormatCell = "A28"
Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" ( _
ByVal hInternetSession As Long, ByVal sServerName As String, _
ByVal nServerPort As Integer, ByVal sUsername As String, _
ByVal sPassword As String, ByVal lService As Long, _
ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" ( _
ByVal sAgent As String, ByVal lAccessType As Long, _
ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias _
"HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As _
String, ByVal sObjectName As String, ByVal sVersion As String, _
ByVal sReferer As String, ByVal something As Long, ByVal lFlags _
As Long, ByVal lContext As Long) As Long
Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias _
"HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, _
ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal _
lModifiers As Long) As Integer
Public Const HTTP_ADDREQ_FLAG_ADD_IF_NEW = &H10000000
Public Const HTTP_ADDREQ_FLAG_ADD = &H20000000
Public Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000
Public Declare Function HttpSendRequest Lib "wininet.dll" Alias _
"HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders _
As String, ByVal lHeadersLength As Long, sOptional As String, _
ByVal lOptionalLength As Long) As Integer
Public Declare Function HttpQueryInfo Lib "wininet.dll" _
Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, _
ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer
Public Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, _
ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) _
As Integer
Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private m_intDecTab(255) As Integer
Private Const m_strEncTabConst As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Public Function EncodeStr64(ByRef strInput As String) As String
Dim i As Long
Dim j As Integer
Dim lngLen As Long
Dim lngQuants As Long
Dim intIndex As Long
Dim strOutput As String
Dim strLast As String
Dim b(2) As Byte
lngLen = Len(strInput)
lngQuants = lngLen \ 3
strOutput = String(lngQuants * 4, " ")
For i = 0 To lngQuants - vbNull
For j = 0 To 2
b(j) = VBA.Asc(VBA.Mid$(strInput, (i * 3) + j + vbNull, vbNull))
Next
Mid(strOutput, intIndex + vbNull, 4) = EncodeQuantum(b)
intIndex = intIndex + 4
Next
Select Case lngLen Mod 3
Case 0
strLast = vbNullString
Case 1
b(0) = VBA.Asc(VBA.Mid$(strInput, lngLen, vbNull))
b(1) = 0&
b(2) = 0&
strLast = EncodeQuantum(b)
strLast = VBA.Left$(strLast, 2) & "=="
Case 2
b(0) = VBA.Asc(VBA.Mid$(strInput, lngLen - vbNull, vbNull))
b(1) = VBA.Asc(VBA.Mid$(strInput, lngLen, vbNull))
b(2) = 0&
strLast = EncodeQuantum(b)
strLast = VBA.Left(strLast, 3) & "="
End Select
EncodeStr64 = strOutput & strLast
End Function
Public Function DecodeStr64(ByRef strEncoded As String) As String
Dim d(3) As Byte
Dim c As Byte
Dim di As Integer
Dim i As Long
Dim lngLen As Long
Dim intIndex As Long
lngLen = Len(strEncoded)
DecodeStr64 = String((lngLen \ 4) * 3, " ")
Call MakeDecTab
For i = vbNull To Len(strEncoded)
c = VBA.CByte(VBA.Asc(VBA.Mid$(strEncoded, i, vbNull)))
c = m_intDecTab(c)
If c >= 0& Then
d(di) = c
di = di + vbNull
If di = 4 Then
Mid$(DecodeStr64, intIndex + vbNull, 3) = DecodeQuantum(d)
intIndex = intIndex + 3
If d(3) = 64 Then
DecodeStr64 = VBA.Left(DecodeStr64, VBA.Len(DecodeStr64) - vbNull)
intIndex = intIndex - vbNull
End If
If d(2) = 64 Then
DecodeStr64 = VBA.Left(DecodeStr64, VBA.Len(DecodeStr64) - vbNull)
intIndex = intIndex - vbNull
End If
di = 0&
End If
End If
Next
End Function
Private Function EncodeQuantum(ByRef b() As Byte) As String
Dim c As Integer
c = SHR2(b(0)) And &H3F
EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)
c = SHL4(b(0) And &H3) Or (SHR4(b(1)) And &HF)
EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)
c = SHL2(b(1) And &HF) Or (SHR6(b(2)) And &H3)
EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)
c = b(2) And &H3F
EncodeQuantum = EncodeQuantum & VBA.Mid$(m_strEncTabConst, c + vbNull, vbNull)
End Function
Private Function DecodeQuantum(ByRef d() As Byte) As String
Dim c As Long
c = SHL2(d(0)) Or (SHR4(d(1)) And &H3)
DecodeQuantum = DecodeQuantum & VBA.Chr$(c)
c = SHL4(d(1) And &HF) Or (SHR2(d(2)) And &HF)
DecodeQuantum = DecodeQuantum & VBA.Chr$(c)
c = SHL6(d(2) And &H3) Or d(3)
DecodeQuantum = DecodeQuantum & VBA.Chr$(c)
End Function
Private Function MakeDecTab()
Dim t As Integer
Dim c As Integer
For c = 0 To 255
m_intDecTab(c) = &HFFF
Next
For c = VBA.Asc("A") To VBA.Asc("Z")
m_intDecTab(c) = t
t = t + vbNull
Next
For c = VBA.Asc("a") To VBA.Asc("z")
m_intDecTab(c) = t
t = t + vbNull
Next
For c = VBA.Asc("0") To VBA.Asc("9")
m_intDecTab(c) = t
t = t + vbNull
Next
c = Asc("+")
m_intDecTab(c) = t
t = t + vbNull
c = Asc("/")
m_intDecTab(c) = t
t = t + vbNull
c = Asc("=")
m_intDecTab(c) = t
End Function
Private Function SHL2(ByVal bytValue As Byte) As Byte
SHL2 = (bytValue * &H4) And &HFF
End Function
Private Function SHL4(ByVal bytValue As Byte) As Byte
SHL4 = (bytValue * &H10) And &HFF
End Function
Private Function SHL6(ByVal bytValue As Byte) As Byte
SHL6 = (bytValue * &H40) And &HFF
End Function
Private Function SHR2(ByVal bytValue As Byte) As Byte
SHR2 = bytValue \ &H4
End Function
Private Function SHR4(ByVal bytValue As Byte) As Byte
SHR4 = bytValue \ &H10
End Function
Private Function SHR6(ByVal bytValue As Byte) As Byte
SHR6 = bytValue \ &H40
End Function
Function URLEncode(strData)
Dim i, c, ln: ln = Len(strData)
For i = 1 To ln
c = Asc(Mid(strData, i, 1))
If c = 32 Then
URLEncode = URLEncode & "+"
ElseIf (c >= 48 And c <= 57) Or (c >= 65 And c <= 90) Or (c >= 97 And c <= 122) Or c = 61 Or c = 38 Then
URLEncode = URLEncode & Chr(c)
Else
c = Hex(c): If Len(c) < 2 Then c = "0" & c
URLEncode = URLEncode & "%" & c
End If
NextEncodeBase64EncodeBase64EncodeBase64
End Function
Private Sub Send_Report()
Dim hInternet As Long, hSession As Long, hINetSession As Long, req As String, hFile As Long, iRes As Long
Dim bDoLoop As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String, postData As String, oServerXMLHTTP As Variant
postData = "nii" + Chr(13) + "" + Chr(13) + "0" + Chr(13) + "строка1" + Chr(13) + "строка2"
Set oServerXMLHTTP = CreateObject("Msxml2.ServerXMLHTTP")
With oServerXMLHTTP
'.Open "POST", "http://belov/sw/FormReciveData.aspx", False
'.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
'.send URLEncode(postData)
'send "" + (postData)
.Open "POST", "http://belov/sw/FormReciveData.aspx", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=windows-1251"
.send postData + ""
End With
' hINetSession = InternetOpen("Excel - Client", 0, vbNullString, vbNullString, 0)
' hSession = InternetConnect(hINetSession, "belov", 80, "", "", 3, 0, 0)
' hFile = HttpOpenRequest(hSession, "POST", "/sw/FormReciveData.aspx", vbNullString, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
' iRes = HttpAddRequestHeaders(hFile, req, Len(req), HTTP_ADDREQ_FLAG_ADD)
' req = "Connection: Keep-Alive"
' iRes = HttpAddRequestHeaders(hFile, req, Len(req), HTTP_ADDREQ_FLAG_ADD)
' postData = "name=nii" + Chr(13) + "pass=" + Chr(13) + "DATA=строка1" + Chr(13) + "строка2"
' iRes = HttpSendRequest(hFile, vbNullString, 0, (postData), Len(postData))
' bDoLoop = True
' While bDoLoop
' sReadBuffer = vbNullString
' bDoLoop = InternetReadFile(hFile, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
' sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
' If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
' Wend
' InternetCloseHandle (hFile)
' InternetCloseHandle (hSession)
' InternetCloseHandle (hINetSession)
MsgBox (oServerXMLHTTP.Status)
iRes = MsgBox(oServerXMLHTTP.ResponseText)
End Sub
Function LastCell(r As Range) As Range
Dim rLast As Range
Set rLast = r.Cells.SpecialCells(xlLastCell)
If rLast.Cells(1, 1).Value = "" Then
On Error Resume Next
Set LastCell = r.Parent.Cells(r.Parent.Cells.Find("*", rLast, , , xlByRows, xlPrevious).Row, r.Parent.Cells.Find("*", rLast, , , xlByColumns, xlPrevious).Column)
If Err.Number <> 0 Then Set LastCell = r.Parent.Cells(1, 1)
On Error GoTo 0
Else
Set LastCell = rLast
End If
Set rLast = Nothing
End Function
Function getLastRow(cSheet As String, cCol As Integer) As Integer
Dim iRow As Integer
Const iMaxRow = 65536
'getLastRow = Columns(ccol).Rows(65536).End(xlUp).Row
With Worksheets(cSheet).Cells(iMaxRow, cCol)
If IsEmpty(.Value) = True Then
iRow = .End(xlUp).Row
Else
iRow = iMaxRow
End If
getLastRow = iRow
End With
End Function
Function GetWordNum(st As String, index As Integer, cdecim As String) As String
Dim i As Double, cnt As Double, ipos As Double, ibegin As Double, iend As Double
i = 1
cnt = 0
ibegin = 0
iend = 0
ipos = InStr(i, st, cdecim)
While ipos > 0 And cnt <= index + 1
ipos = InStr(i, st, cdecim)
If ipos > 0 Then
If ipos > 0 Then cnt = cnt + 1
If cnt = index - 1 Then ibegin = ipos + Len(cdecim)
If (index = 1 And cnt = 1) Then ibegin = 1
If cnt = index Then iend = ipos
End If
i = ipos + 1
Wend
GetWordNum = ""
If ipos = 0 And cnt = 0 And index = 1 Then GetWordNum = st
If ibegin > 0 Then
If iend = 0 Then iend = Len(st) + 1
GetWordNum = Mid(st, ibegin, iend - ibegin)
End If
End Function
Function GetWordCount(st As String, cdecim As String) As Integer
Dim i As Double, cnt As Double, ipos As Double, ibegin As Double, iend As Double
i = 1
cnt = 0
ibegin = 0
iend = 0
ipos = InStr(i, st, cdecim)
While ipos > 0
ipos = InStr(i, st, cdecim)
If ipos > 0 Then
If ipos > 0 Then cnt = cnt + 1
End If
i = ipos + 1
Wend
GetWordCount = cnt + 1
End Function
Private Sub Make_Report_run(cPath As String, cWeb As String, cUser As String)
Worksheets("System").Cells(16, 2).Value = cUser
Worksheets("System").Cells(17, 2).Value = cWeb
Make_Report (cPath)
End Sub
Private Sub Make_Report_Svod_ks(cPath As String, cServer As String, cBase As String, cUser As String)
Worksheets("System").Cells(16, 2).Value = cUser
Worksheets("System").Cells(22, 2).Value = cServer
Worksheets("System").Cells(23, 2).Value = cBase
Make_Report (cPath)
End Sub
Private Sub Make_Report_run1()
Make_Report ("D:\smeta\Excel\test.txt")
End Sub
Private Sub Make_Report(FileName As String)
Dim hFile As Long, cFileName As String, TextLine As String, _
lHeader As Integer, cVersion As String, lcError As String, Response As Integer, _
aHeader As Variant, cCode_Form As String, lcBegin As String, lcEnd As String, cDate_Form As String, _
cDep_Code As String, cOrg_Name As String, cBUDG As String, cBUDG_NAME As String, _
liCountTable As Integer, cCount_Table As String, liCountCol As Integer, i As Integer, liCol As Integer, _
lcVal_Len As String, lcRow As String, iRow As Integer, li As Integer, aCols As Variant, iCols As Integer, _
lcExport_order As String, cNAME_Form As String, max_row As Integer, rgb_value As String, code_col As Integer, _
code As String, find_range As Range, Property_col As String, liCountAtr As Integer
Close #1
On Error Resume Next
Application.DisplayAlerts = False
cFileName = FileName
If Dir(cFileName) <> "" Then
' Открываем файл для последовательного доступа.
Open cFileName For Input Access Read As #1
lHeader = 0
lcError = ""
liCountTable = 0
liCountCol = 0
liCol = 1
liCountAtr = 0
Property_col = "0"
Worksheets("System").Range("C2:Z1000").Value = ""
Worksheets("System").Range("B2:B15").Value = ""
Worksheets("System").Range("D2:D15").Value = ""
Worksheets("Реквизиты").Unprotect
For i = 3 To Sheets.Count
Sheets(3).Delete
Next
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, TextLine ' Read line into variable.
'проверяем версию файла
'читаем заголовок
If Trim(TextLine) = "PROGRAM=Excel_Client" Then
lHeader = lHeader + 1
End If
If GetWordNum(TextLine, 1, "=") = "VERSION" Then
cVersion = GetWordNum(TextLine, 2, "=")
If cVersion = cVer Then
lHeader = lHeader + 1
Else
lcError = "Неверная версия: " + cVersion + ". Ожидается версия: " + cVer
End If
End If
'если заголовок прочитан и он верный
If lHeader = 2 Then
'начало блока
If Left(Trim(TextLine), 1) = "[" Then
lcBegin = Trim(TextLine)
lcEnd = ""
End If
'конец блока
If Trim(TextLine) = "##" Then
lcEnd = "END"
End If
Select Case lcBegin
'блок описания формы
Case "[FORM]"
Select Case GetWordNum(TextLine, 1, "=")
Case "CODE_FORM"
cCode_Form = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(2, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "NAME_FORM"
cNAME_Form = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(3, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "DATE_FORM"
cDate_Form = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(4, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "DEP_CODE"
cDep_Code = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(5, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "ORG_NAME"
cOrg_Name = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(6, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "BUDG"
cBUDG = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(7, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "BUDG_NAME"
cBUDG_NAME = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(8, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "BEGIN_DATE"
Worksheets("System").Cells(12, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "PERIOD_TYPE"
Worksheets("System").Cells(13, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "VERSION_FORM"
Worksheets("System").Cells(19, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "PERIOD_NUMBER"
Worksheets("System").Cells(14, 2).Value = Trim(GetWordNum(TextLine, 2, "="))
End Select
'блок описания таблиц
Case "[TABLE]"
Select Case GetWordNum(TextLine, 1, "=")
Case "#@"
liCountTable = liCountTable + 1
Sheets.Add After:=Worksheets(Sheets.Count)
Worksheets(Sheets.Count).name = "Таблица " + Str(liCountTable)
Case "COUNT_TABLE"
cCount_Table = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(yTable + 1, xTable).Value = "COUNT_TABLE"
Worksheets("System").Cells(yTable + 1, xTable + 1).Value = cCount_Table
Case "ORDERS"
Worksheets("System").Cells(yTable + liCountTable, xTable + 2).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "NAME"
Worksheets("System").Cells(yTable + liCountTable, xTable + 3).Value = Trim(GetWordNum(TextLine, 2, "="))
Worksheets(liCountTable + 2).Cells(1, 1).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "COUNT_COL"
Worksheets("System").Cells(yTable + liCountTable, xTable + 4).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "VAL_TYPE"
Worksheets("System").Cells(yTable + liCountTable, xTable + 6).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "CODE_COL"
Worksheets("System").Cells(yTable + liCountTable, xTable + 5).Value = Trim(GetWordNum(TextLine, 2, "="))
With Worksheets(Worksheets("System").Cells(yTable + liCountTable, xTable + 2).Value + 2)
' .Range(Cells(5, Val(Trim(GetWordNum(TextLine, 2, "="))) + 1), Cells(5, Val(Trim(GetWordNum(TextLine, 2, "="))) + 1)).Select
.Range(Cells(5, 1), Cells(5, 1)).Select
.Activate
ActiveWindow.FreezePanes = True
End With
End Select
'блок описания колонок
Case "[COLS]"
Select Case GetWordNum(TextLine, 1, "=")
Case "##"
liCountCol = liCountCol + 1
Case "#@"
liCountCol = liCountCol + 1
Case "TABLE"
Worksheets("System").Cells(yCol + liCountCol, xCol + 2).Value = Trim(GetWordNum(TextLine, 2, "="))
liCountTable = Val(Trim(GetWordNum(TextLine, 2, "=")))
Case "ORDERS"
Worksheets("System").Cells(yCol + liCountCol, xCol + 3).Value = Trim(GetWordNum(TextLine, 2, "="))
liCol = Trim(GetWordNum(TextLine, 2, "="))
Case "NAME"
Worksheets("System").Range(xyFormatHead).Copy Worksheets(liCountTable + 2).Cells(3, liCol)
Worksheets("System").Range(xyFormatHead).Copy Worksheets(liCountTable + 2).Cells(4, liCol)
Worksheets("System").Cells(yCol + liCountCol, xCol + 4).Value = Trim(GetWordNum(TextLine, 2, "="))
Worksheets(liCountTable + 2).Cells(3, liCol).Value = Trim(GetWordNum(TextLine, 2, "="))
'установка ширины колонки
Case "INPUT_MASK"
Worksheets("System").Cells(yCol + liCountCol, xCol + 5).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "EDIT"
Worksheets("System").Cells(yCol + liCountCol, xCol + 6).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "VAL_LEN"
Worksheets("System").Cells(yCol + liCountCol, xCol + 7).Value = Trim(GetWordNum(TextLine, 2, "="))
lcVal_Len = Trim(GetWordNum(TextLine, 2, "="))
Case "COL_TYPE"
Worksheets("System").Cells(yCol + liCountCol, xCol + 8).Value = Trim(GetWordNum(TextLine, 2, "="))
If Trim(GetWordNum(TextLine, 2, "=")) = "0" Then
Worksheets(liCountTable + 2).Columns(liCol).ColumnWidth = 20
Worksheets(liCountTable + 2).Columns(liCol).NumberFormat = "0.00"
If Val(lcVal_Len) > 0 Then
Worksheets(liCountTable + 2).Columns(liCol).NumberFormat = "0." + Application.WorksheetFunction.Rept("0", Val(lcVal_Len))
Else
Worksheets(liCountTable + 2).Columns(liCol).NumberFormat = "0"
End If
End If
'проставим ширину колонок
If Trim(GetWordNum(TextLine, 2, "=")) = "1" Then
If lcVal_Len <> "0" And lcVal_Len <> "" Then
If Val(lcVal_Len) > 50 Then
lcVal_Len = "50"
End If
If Val(lcVal_Len) < 6 Then
lcVal_Len = "6"
End If
Worksheets(liCountTable + 2).Columns(liCol).ColumnWidth = Val(lcVal_Len)
Else
Worksheets(liCountTable + 2).Columns(liCol).ColumnWidth = 20
End If
Worksheets(liCountTable + 2).Columns(liCol).NumberFormat = "@"
End If
Worksheets(liCountTable + 2).Rows(3).AutoFit
Worksheets(liCountTable + 2).Rows(4).NumberFormat = "@"
Case "EXPORT_ORDER"
lcExport_order = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(yCol + liCountCol, xCol + 9).Value = lcExport_order
If lcExport_order <> "0" Then
Worksheets(liCountTable + 2).Cells(4, liCol).Value = lcExport_order
End If
Case "PROPERTY"
Worksheets("System").Cells(yCol + liCountCol, xCol + 10).Value = Trim(GetWordNum(TextLine, 2, "="))
Property_col = Trim(GetWordNum(TextLine, 2, "="))
If Property_col <> "0" Then
If (Val(Property_col) And 1) = 1 Then
Worksheets(liCountTable + 2).Columns(liCol).ColumnWidth = 0.08
Worksheets(liCountTable + 2).Columns(liCol).HorizontalAlignment = xlFill
End If
End If
End Select
'Атрибуты
Case "[ATRIBUT]"
Select Case GetWordNum(TextLine, 1, "=")
Case "[ATRIBUT]"
liCountAtr = 0
Case "#@"
liCountAtr = liCountAtr + 1
'рисуем атрибут начиная с ячейки С
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeLeft).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeLeft).Weight = xlMedium
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeTop).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeTop).Weight = xlMedium
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeBottom).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeBottom).Weight = xlMedium
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeRight).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Borders(xlEdgeRight).Weight = xlMedium
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Interior.ColorIndex = 15
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Interior.Pattern = xlSolid
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeLeft).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeLeft).Weight = xlMedium
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeTop).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeTop).Weight = xlMedium
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeBottom).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeBottom).Weight = xlMedium
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeRight).LineStyle = xlContinuous
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Borders(xlEdgeRight).Weight = xlMedium
Case "CODE_ATR"
Worksheets("System").Cells(1 + liCountAtr, 4).Value = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("System").Cells(1 + liCountAtr, 5).Value = liCountAtr
Case "NAME_ATR"
Worksheets("Реквизиты").Cells(24, 2 + liCountAtr).Value = Trim(GetWordNum(TextLine, 2, "="))
Case "STR_VAL"
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Value = Trim(GetWordNum(TextLine, 2, "="))
Worksheets("Реквизиты").Cells(25, 2 + liCountAtr).Locked = False
'Worksheets("Реквизиты").Rows(2 + liCountAtr).AutoFit
End Select
'данные
Case "[DATA]"
Select Case GetWordNum(TextLine, 1, "=")
Case "[DATA]"
liCountTable = 0
iRow = 0
Case "#@"
If iRow <> 0 And liCountTable <> 0 Then
li = SetFormatCells(iRow + 5, iCols, liCountTable + 2)
End If
liCountTable = liCountTable + 1
iRow = 0
Case "ROW"
If Len(TextLine) > 4 Then
lcRow = Right(TextLine, Len(TextLine) - 4)
Else
lcRow = ""
End If
iCols = GetWordCount(lcRow, "|")
For li = 1 To GetWordCount(lcRow, "|")
Worksheets(liCountTable + 2).Cells(iRow + 5, li).Value = Trim(GetWordNum(lcRow, li, "|"))
Application.StatusBar = "Подождите ... Идет форматирование данных ... Таблица №" + Str(liCountTable) + ". Строка №" + Str(iRow)
Next
iRow = iRow + 1
Case "RGB"
If Len(TextLine) > 4 Then
lcRow = Right(TextLine, Len(TextLine) - 4)
Else
lcRow = ""
End If
code_col = Worksheets("System").Cells(liCountTable + 1, 12).Value
code = GetWordNum(lcRow, 1, "|")
Worksheets(liCountTable + 2).Activate
max_row = getLastRow("Таблица " + Str(liCountTable), code_col)
With Range(Cells(5, code_col), Cells(max_row, code_col))
Set find_range = .Find(code, LookIn:=xlValues, LookAt:=xlWhole)
If Not find_range Is Nothing Then
For li = 2 To GetWordCount(lcRow, "|")
rgb_value = GetWordNum(lcRow, li, "|")
Worksheets(liCountTable + 2).Cells(find_range.Row, li - 1).Interior.Color = Val(rgb_value)
Next
End If
End With
End Select
End Select
End If
If lcError <> "" Then
Response = MsgBox("Ошибка:" + lcError, vbInformation)
Exit Do
End If
Loop
' Закрываем файл.
Close #1
Else
Response = MsgBox("Файл " + cFileName + " не найден!", vbInformation)
End If
If iRow <> 0 And iCols <> 0 And liCountTable <> 0 Then
li = SetFormatCells(iRow + 5, iCols, liCountTable + 2)
End If
'Worksheets(2).Cells(1, 1).Value = "Код отчета: " + Worksheets("System").Cells(2, 2).Value + " Наименование: " + Worksheets("System").Cells(3, 2).Value
'проставляем периоды
Worksheets("System").Cells(9, 2).Value = GetWordNum(Worksheets("System").Cells(12, 2).Value, 3, ".")
Worksheets("System").Cells(10, 2).Value = 1
Worksheets("System").Cells(11, 2).Value = 1
Select Case Worksheets("System").Cells(13, 2).Value
Case 1 'год
Worksheets("Реквизиты").Opt_Y.Value = True
Case 2 'квартал
Worksheets("System").Cells(10, 2).Value = Worksheets("System").Cells(14, 2).Value
Worksheets("Реквизиты").Opt_Q.Value = True
Case 4 'месяц
Worksheets("System").Cells(11, 2).Value = Worksheets("System").Cells(14, 2).Value
Worksheets("Реквизиты").Opt_M.Value = True
End Select
Worksheets("Реквизиты").Activate
Worksheets("Реквизиты").Unprotect
'удаляем реквизиты
If liCountAtr = 0 Then
Worksheets("Реквизиты").Range("C24:C25").EntireRow.Delete
End If
Worksheets("Реквизиты").Cells(2, 2).Formula = "Форма:" + Worksheets("System").Cells(2, 2).Value + " " + Worksheets("System").Cells(3, 2).Value
Worksheets("Реквизиты").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Worksheets("Реквизиты").EnableSelection = xlUnlockedCells
Application.StatusBar = ""
'Response = MsgBox("Обновление завершено!", vbInformation)
Application.DisplayAlerts = True
End Sub
Function SetFormatCells(iRow As Integer, iCols As Integer, iSheet As Integer) As Integer
Dim x As Integer, y As Integer
x = 5
y = 1
Worksheets(iSheet).Activate
' With Range(Cells(x, y), Cells(iRow, iCols))
' .HorizontalAlignment = xlRight
' .VerticalAlignment = xlBottom
' .WrapText = True
' End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Range(Cells(x, y), Cells(iRow, iCols)).Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Function
Function listexists(name As String) As Boolean
Dim obj As Object
On Error Resume Next
Set obj = Sheets(name)
listexists = (Err.Number = 0)
End Function
Function Get_Report(saveNull As Boolean, pNewVers As Boolean, sendCRC As Boolean) As String
Dim max_tmp As Integer, limax As Integer, cCol As String, ctext As String, MaxRow As Integer, CountTable As Integer, ColCount As Integer, ColTable As Integer, li As Integer, lj As Integer, ColCode As Integer, lij As Integer, crow As String, a As DataObject, liAtr As Integer, yColTable As Integer, cRows As String, isNull As Boolean, cValue As String, crc As Long, onlytext As Integer
crc = 0
ctext = ""
'формируем заголовок
cCol = "B"
ctext = ctext + "PROGRAM = Excel_Client" + Chr(13) + Chr(10)
ctext = ctext + "VERSION=1.2" + Chr(13) + Chr(10)
ctext = ctext + "DATE=" + CStr(Date) + " " + CStr(Time) + Chr(13) + Chr(10)
ctext = ctext + "USER=" + Worksheets("System").Range(cCol + "16").Value + Chr(13) + Chr(10)
'формируем заголовок формы
ctext = ctext + "##" + Chr(13) + Chr(10)
ctext = ctext + "[FORM]" + Chr(13) + Chr(10)
ctext = ctext + "CODE_FORM=" + CStr(Worksheets("System").Range(cCol + "2").Value) + Chr(13) + Chr(10)
ctext = ctext + "DATE_FORM=" + CStr(Worksheets("System").Range(cCol + "4").Value) + Chr(13) + Chr(10)
ctext = ctext + "DEP_CODE=" + CStr(Worksheets("System").Range(cCol + "5").Value) + Chr(13) + Chr(10)
ctext = ctext + "BUDG=" + CStr(Worksheets("System").Range(cCol + "7").Value) + Chr(13) + Chr(10)
ctext = ctext + "YEAR=" + CStr(Worksheets("System").Range(cCol + "9").Value) + Chr(13) + Chr(10)
ctext = ctext + "PERIOD=" + CStr(Worksheets("System").Range(cCol + "13").Value) + Chr(13) + Chr(10)
If Worksheets("System").Range(cCol + "13").Value = 2 Then
ctext = ctext + "PERIOD_NUM=" + CStr(Worksheets("System").Range(cCol + "10").Value) + Chr(13) + Chr(10)
Else
ctext = ctext + "PERIOD_NUM=" + CStr(Worksheets("System").Range(cCol + "11").Value) + Chr(13) + Chr(10)
End If
ctext = ctext + "VERSION_FORM=" + CStr(Worksheets("System").Range(cCol + "19").Value) + Chr(13) + Chr(10)
If pNewVers = True Then
ctext = ctext + "NEW_VERSION=1" + Chr(13) + Chr(10)
End If
'атрибуты
liAtr = 2
ctext = ctext + "[ATRIBUTS]" + Chr(13) + Chr(10)
While CStr(Worksheets("System").Cells(liAtr, 4).Value) <> ""
ctext = ctext + CStr(Worksheets("System").Cells(liAtr, 4).Value) + "=" + Trim(CStr(Worksheets("Реквизиты").Cells(25, 1 + liAtr).Value)) + Chr(13) + Chr(10)
liAtr = liAtr + 1
Wend
ctext = ctext + "##" + Chr(13) + Chr(10)
'данные
CountTable = Val(Worksheets("System").Range("H2").Value)
For li = 1 To CountTable
yColTable = 2
While Val(Worksheets("System").Cells(yColTable, 17).Value) <> li
yColTable = yColTable + 1
Wend
ColCode = Val(Worksheets("System").Range("L" + CStr(li + 1)).Value)
max_tmp = 0
'проверим существует ли лист
If listexists("Таблица " + Str(li)) = False Then
MsgBox ("Сохранение прервано. Не найден лист: " + "Таблица " + Str(li))
Get_Report = "-1"
Exit Function
End If
For limax = 1 To ColCode
MaxRow = getLastRow("Таблица " + Str(li), limax)
If max_tmp < MaxRow Then
max_tmp = MaxRow
End If
Next
MaxRow = max_tmp
ctext = ctext + "ТБ=" + CStr(li) + Chr(13) + Chr(10)
ColCount = Val(Worksheets("System").Range("K" + CStr(li + 1)).Value)
onlytext = 1
For lij = 1 To ColCount
If Val(Worksheets("System").Cells(yColTable + lij - 1, 23).Value) = 0 Then
onlytext = 0
End If
Next
For lj = 5 To MaxRow
crow = "ROW" + CStr(li) + "="
isNull = True
For lij = 1 To ColCount
If Val(Worksheets("System").Cells(yColTable + lij - 1, 23).Value) = 0 Then
'cValue = CStr(Val(Replace(CStr(Worksheets("Таблица " + Str(li)).Cells(lj, lij).Value), ",", ".")))
cValue = CStr(Val(Replace(Replace(CStr(Worksheets("Таблица " + Str(li)).Cells(lj, lij).Value), ",", "."), Chr(160), "")))
crow = crow + cValue + "|"
If saveNull = False And cValue <> "0" Then
isNull = False
End If
Else
crow = crow + Replace(CStr(Worksheets("Таблица " + Str(li)).Cells(lj, lij).Value), "'", """") + "|"
End If
Next
If onlytext = 1 Then
isNull = False
End If
crow = (Replace(crow, "+", "#plus#"))
crow = (Replace(crow, Chr(10), ""))
crow = (Replace(crow, Chr(13), ""))
If saveNull = False And isNull = False Then
crc = crc16(crow, crc)
ctext = ctext + crow + Chr(13) + Chr(10)
End If
If saveNull = True Then
crc = crc16(crow, crc)
ctext = ctext + crow + Chr(13) + Chr(10)
End If
Next
Next
If sendCRC = True Then
ctext = ctext + "CRC=" + Str(crc)
End If
' Open "D:\SMETA\EXCEL\out.txt" For Output As #1
' Print #1, cText
' Close #1
Get_Report = ctext
End Function
Public Function uiShiftRightBy8(x As Integer) As Integer
' Shift 16-bit integer value to right by 8 bits
' Avoiding problem with sign bit
Dim iNew As Integer
iNew = (x And &H7FFF) \ 256
If (x And &H8000) <> 0 Then
iNew = iNew Or &H80
End If
uiShiftRightBy8 = iNew
End Function
Public Function crc16(pcstr As String, piCrc As Long) As Long
Dim aCRC(256) As Long
aCRC(0) = 0
aCRC(1) = 4129
aCRC(2) = 8258
aCRC(3) = 12387
aCRC(4) = 16516
aCRC(5) = 20645
aCRC(6) = 24774
aCRC(7) = 28903
aCRC(8) = 33032
aCRC(9) = 37161
aCRC(10) = 41290
aCRC(11) = 45419
aCRC(12) = 49548
aCRC(13) = 53677
aCRC(14) = 57806
aCRC(15) = 61935
aCRC(16) = 4657
aCRC(17) = 528
aCRC(18) = 12915
aCRC(19) = 8786
aCRC(20) = 21173
aCRC(21) = 17044
aCRC(22) = 29431
aCRC(23) = 25302
aCRC(24) = 37689
aCRC(25) = 33560
aCRC(26) = 45947
aCRC(27) = 41818
aCRC(28) = 54205
aCRC(29) = 50076
aCRC(30) = 62463
aCRC(31) = 58334
aCRC(32) = 9314
aCRC(33) = 13379
aCRC(34) = 1056
aCRC(35) = 5121
aCRC(36) = 25830
aCRC(37) = 29895
aCRC(38) = 17572
aCRC(39) = 21637
aCRC(40) = 42346
aCRC(41) = 46411
aCRC(42) = 34088
aCRC(43) = 38153
aCRC(44) = 58862
aCRC(45) = 62927
aCRC(46) = 50604
aCRC(47) = 54669
aCRC(48) = 13907
aCRC(49) = 9842
aCRC(50) = 5649
aCRC(51) = 1584
aCRC(52) = 30423
aCRC(53) = 26358
aCRC(54) = 22165
aCRC(55) = 18100
aCRC(56) = 46939
…
|
|||
vbaProject_00.bin |
vba-project | OOXML VBA project: xl/vbaProject.bin | 205824 bytes |
SHA-256: a7cab4f0d1ca8d900847cf68de81dc0f09566d12f72fd2e1ad91ef2678a13edf |
|||
emf_00.emf |
ooxml-emf | OOXML EMF part: xl/media/image8.emf | 2612 bytes |
SHA-256: b6085b83fed201b62c3279fe3ee5f478ba8a4eb7a2dbce749254c4a34dd30b6a |
|||
emf_01.emf |
ooxml-emf | OOXML EMF part: xl/media/image9.emf | 1296 bytes |
SHA-256: 40f62b124151b0f48205cc9a2f49750bfbe70600930a76ad3d49eac860558e16 |
|||
emf_02.emf |
ooxml-emf | OOXML EMF part: xl/media/image10.emf | 2424 bytes |
SHA-256: dd895a1e459fccdbd0e05b92431e66908594aaf1004134b9fad259acc4f3058a |
|||
emf_03.emf |
ooxml-emf | OOXML EMF part: xl/media/image11.emf | 1380 bytes |
SHA-256: 871afc908698c417616c31502124ff2d32364a1f0e757b0f73e5a75c4251d4cb |
|||
emf_04.emf |
ooxml-emf | OOXML EMF part: xl/media/image7.emf | 1580 bytes |
SHA-256: b91594b9d4dda5490569c923cbe78b25b03a9c316e3e17d06d50d09536a26c35 |
|||
emf_05.emf |
ooxml-emf | OOXML EMF part: xl/media/image6.emf | 4244 bytes |
SHA-256: 043acbe2dc62dab3000701321d3f0a8a4e6e99d81ae462267033b9f6390403f6 |
|||
emf_06.emf |
ooxml-emf | OOXML EMF part: xl/media/image5.emf | 4292 bytes |
SHA-256: 6dfd6cf26cdb8e3e84885e0170fc4f1c106013eccdf92d9ee04962e9ad65dcfe |
|||
emf_07.emf |
ooxml-emf | OOXML EMF part: xl/media/image4.emf | 2432 bytes |
SHA-256: 42ac1284ae847afc40c6edb5b4bfb732b3f1d77691d70ec49910df038ed2c7d6 |
|||
emf_08.emf |
ooxml-emf | OOXML EMF part: xl/media/image3.emf | 2992 bytes |
SHA-256: 66ef22256c906a85001a1881a7105ae6e2cacc43a8b9d0ae724fa79cb02e6992 |
|||
emf_09.emf |
ooxml-emf | OOXML EMF part: xl/media/image12.emf | 1368 bytes |
SHA-256: 7dbe5ce781ecc9ac5bcec2b6f141b0f085f2c86d06c19ea3f39c8ddbcd57e3fd |
|||
emf_10.emf |
ooxml-emf | OOXML EMF part: xl/media/image13.emf | 2588 bytes |
SHA-256: c156825dc62a3940b713e628b0c0dc18ed0ce1c54a7ef3d1c9ccb0557f62e9c5 |
|||
emf_11.emf |
ooxml-emf | OOXML EMF part: xl/media/image14.emf | 2408 bytes |
SHA-256: 3728d28f11086d1703c9ce2017950d741368acfbe4c77cd9db052320cf26eba1 |
|||
emf_12.emf |
ooxml-emf | OOXML EMF part: xl/media/image17.emf | 2840 bytes |
SHA-256: da858e696af068b80998895a962fa6f11b6ea330a6d87f6440fa639fc54cc4fd |
|||
emf_13.emf |
ooxml-emf | OOXML EMF part: xl/media/image16.emf | 1820 bytes |
SHA-256: 80b264ff195e6acf45c33fa97c20c45a2365ba4b201fc104d9cf25b0af7884c5 |
|||
emf_14.emf |
ooxml-emf | OOXML EMF part: xl/media/image15.emf | 2852 bytes |
SHA-256: e7727d63ff8801b0d980d5d878d21c2197c144c81108d00cf674ec4dc94b0f75 |
|||
emf_15.emf |
ooxml-emf | OOXML EMF part: xl/media/image1.emf | 3112 bytes |
SHA-256: f08e5bee8a9fe188722d5d6c9530c90352b5991a1b0c060c84db8e624b3dfaab |
|||
emf_16.emf |
ooxml-emf | OOXML EMF part: xl/media/image2.emf | 3148 bytes |
SHA-256: c641e47f60a3f1e2f5f4cb6953430a6c7e762c470dc15cbb8cf5e1c002f16b45 |
|||
Open this report in the interactive analyzer, or submit your own file for analysis.