Chuyên mục xử lý, gỡ rối code VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,954
hi bác @be09

Em có mò sửa lại code file trên để tách rời 2 file: bảng tính - data.
Nhưng gặp vấn đề ở đây là file data file luôn mở khi chạy bảng tính.
Em có đọc bài này http://www.giaiphapexcel.com/vbb/sh...-liệu-từ-1-file-đang-đóng&p=260991#post260991
Nhưng không rõ áp dụng trong trường hợp của em thì nên sử dụng như thế nào?
Bác có thể hướng 1 chút giúp em được không?
Tôi thấy bạn đưa cái File này: Ladder size Calculation v1, khác với sheet gốc mà không diễn giải nên chẳng hiểu gì ráo.
Còn đưa cái Link lấy dữ liệu File đang đóng, cả 2 vấn đề thấy không có liên quan gì với nhau nên cũng chẳng hiểu gì luôn.

Bạn nên mở Topic mới có ví dụ thực tế và giải thích cái cần rỏ ràng hơn, để các thành viên có hiểu mới giúp được tập trung hơn.
 
Upvote 0
Em chào các anh, em mong các anh giúp em vấn đề này với ạ :
Em cần gửi email phiếu lương cho khoảng 500 anh em. Em có sưu tầm được 1 code về tự động gửi email trong excel, tuy nhiên code đó gửi mail theo từng sheet riêng rẽ một. Mà file dữ liệu gửi của em nó nằm trong 1 sheet, và dữ liệu của 1 người đều đồng nhất mỗi người 31 dòng. Em muốn gửi thông tin từng người tới từng địa chỉ email của người đó. ( Em dùng OUTLOOK ạ )
Em mong các anh giúp em ạ
Mã:
Sub Send_Files()
'Working in 2000-2007
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim cell As Range, FileCell As Range, rng As Range
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
Set sh = Sheets("Sheet1")
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
For Each cell In sh.Columns("B").Cells.SpecialCells(xlCellTypeConstants)
    'Enter the file names in the C:Z column in each row
    Set rng = sh.Cells(cell.Row, 1).Range("C1:Z1")
    If cell.Value Like "?*@?*.?*" And Application.WorksheetFunction.CountA(rng) > 0 Then
        Set OutMail = OutApp.CreateItem(0)
        With OutMail
            .To = cell.Value
            .Subject = "Testfile"
            .Body = "Hi " & cell.Offset(0, -1).Value
            For Each FileCell In rng.SpecialCells(xlCellTypeConstants)
                If Trim(FileCell) <> "" Then
                    If Dir(FileCell.Value) <> "" Then
                        .Attachments.Add FileCell.Value
                    End If
                End If
            Next FileCell
            .Send
            'Or use Display
        End With
        Set OutMail = Nothing
    End If
Next cell
Set OutApp = Nothing
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub
 

File đính kèm

Upvote 0
Trong File mình đang sử dụng có nhiều sub nó giống nhau ... giờ mình muốn viết lại nó thành một cái Hàm bao quát nhất có thể sử dụng cho nhiều trường hợp khác nhau ... mà đang lúng túng xử lý For next xong nối các chuỗi lại ... Vì vậy Úp bài nhờ các bạn trợ giúp xử lý dùm

1/ Code mẫu nếu sử dụng 1 Vòng For thì Ok ... nhưng khi Mình mở rộng Mảng Arr() thì phải điều chỉnh lại code mất công quá
chuỗi Qry sau mỗi lần For tại F1
Mã:
Private Sub Test_Mau()
    Dim Arr(), i As Long, x1, x2
    Dim Qry As String
    Arr = Range("A4:B100").Value
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) <> "" Then
            x1 = GetValue(Arr(i, 1))
            x2 = GetValue(Arr(i, 2))
            MsgBox x1
            Qry = "INSERT INTO Manh2 VALUES(" _
                & i & ", " & x1 & ", " & x2 & ")"
            Range("F1").Value = Qry
        End If
    Next
End Sub
2/ Code sau Mình muốn cho nó vào Mảng Động .... có nghĩa mình muốn thêm hay bớt cột thì duyệt For ở dưới nó tự lấy theo và nối chuỗi đó vào Qry giống như sub Trên ... Chuỗi nối theo thứ tự tại F2
Mã:
Private Sub Test_NhoXuLy()
    Dim Arr(), i As Long, j As Long, n
    Dim Res(), x1, x2
    Dim Qry As String
    Arr = Range("E4:I100").Value                            ''mang nay co the then nhieu cot hay giam bot
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) <> "" Then
            For j = 1 To UBound(Arr, 2)                     ''duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
                'x1 = GetValue(Arr(i, 1))
                'x2 = GetValue(Arr(i, 2))                   ''Bo het kieu nay
                'MsgBox " OK"                               ''Gan mang Arr(i,j) lam sao vao Qry noi cac chuoi lai voi nhau nhu sub Test_Mau
                Qry = "INSERT INTO Manh2 VALUES(" _
                    & i & ", " & x1 & ", " & x2 & ")"
                Range("F2").Value = Qry                     ''Cac chuoi sau khi noi lai trong mang
            Next
        End If
    Next
End Sub
Mình đang lúng túng xử lý ở Mục 2 làm sao duyệt For mà bỏ hết x1,x2,... xn đi mà nó tự nối chuỗi vào Qry như mục 1
Xin cản ơn
 

File đính kèm

Upvote 0
Qry = " INSERT INTO Manh2 VALUES( " & i
For j = 1 To UBound(Arr, 2) 'duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
Qry = Qry & ", " & GetValue(Arr(i, j))
Next
Qry = Qry & " )"
Range("F2").Value = Qry 'Cac chuoi sau khi noi lai trong mang

1. đây là giả sử câu insert của bạn khong cần tên trường (số trường insert tương đương với mặc định)

2. cũng giả sử rằng cái hàm GetValue của bạn nó tự biết thêm dấu nháy cho các dữ liệu chuỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Qry = " INSERT INTO Manh2 VALUES( " & i
For j = 1 To UBound(Arr, 2) 'duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
Qry = Qry & ", " & GetValue(Arr(i, j))
Next
Qry = Qry & " )"
Range("F2").Value = Qry 'Cac chuoi sau khi noi lai trong mang

1. đây là giả sử câu insert của bạn khong cần tên trường (số trường insert tương đương với mặc định)

2. cũng giả sử rằng cái hàm GetValue của bạn nó tự biết thêm dấu nháy cho các dữ liệu chuỗi.
Mình đang suy nghĩ là nếu ta không sử dụng phương thức insert ... mà ta sử dụng phương thức sau
Mã:
Rst.Open tableName, MyString, adOpenStatic, adLockOptimistic
For i = 1 To UBound(Res, 1)  
        Rst.AddNew
        For j = 1 To Rst.Fields.Count - 1
            Rst.Fields(j) = Res(i, j)
        Next j  
Next i
Rst.Update
Thì giữa 2 cái đó áp dụng cho trường hợp nào sẻ yêu việt hơn vv...
Tại vì code két mình tự học và bắt trước người ta làm sao mình làm vậy nếu chạy thấy lỗi thì tìm cách sửa nên ko hiểu hết được bản chất thật sự của 2 cách trên
Mong bạn chỉ thêm ... Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
sub down()
 Dim ChromeLocation  As String
Linkurl   ' là link down trực tiếp
 ChromeLocation = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
  Shell (ChromeLocation & " -url & Linkurl )
End sub

Khi chạy code trên đến đoạn gọi Firefox thì cửa sổ trình duyệt bung ra, rất bất tiện, vì em không cần thao tác tay trên trình duyệt nên
Em muốn ẩn Firefox khi chạy code ( giống như IE mình có lệnh : IE.visble = false), Mong các anh giúp đỡ!
 
Upvote 0
Insert từng record là cách căn bản của chạy trực tiếp trên CSDL
Dùng recordset là dùng giao diện gián tiếp qua code.
Đã viết code thì dùng giao diện tiện hơn.
 
Upvote 0
Có ai giúp giùm em cái này không ạ. file excel của em khi chạy marco vba này luôn mặc định là trình duyệt IE. em muốn chuyển sang mở bằng Chrome hoặc Firefox nhưng em k biết về code. đoạn code trong file module như sau:



Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim URL As String
Dim BVISIBLE As Boolean
Dim DELAY As Long
Dim NUM As String
Dim SHUTD As Integer

Dim SES_col As Integer
Const TYPE_CLICK As String = "CLICK"
Const TYPE_SET As String = "SET"
Const TYPE_URL As String = "URL"
Const TYPE_GET As String = "GETDATA"
Const TYPE_GETLINK As String = "GETLINK"
Const TYPE_SEND As String = "SEND"
Const TYPE_SEARCH1 As String = "SEARCHLINK"
Const TYPE_FORCE As String = "FORCE" 'right type

Sub reg_web()
Dim sh As Variant
Dim i, j As Long
Dim r1, r2, r3 As Variant
Dim rowfrom, colfrom As Long

Set sh = ThisWorkbook.ActiveSheet

If Not init(sh) Then
Exit Sub
End If

colfrom = 0
NUM = 0
ReDim r1(NUM)
ReDim r2(NUM)
ReDim r3(NUM)
For j = 1 To 65535
If sh.Rows(2).Cells(j).value = "" And sh.Rows(2).Cells(j + 1).value = "" _
And sh.Rows(2).Cells(j + 2).value = "" Then
Exit For
End If

NUM = NUM + 1
ReDim Preserve r1(1 To NUM)
ReDim Preserve r2(1 To NUM)
ReDim Preserve r3(1 To NUM)
r1(j) = Trim(CStr(sh.Rows(2).Cells(j).value))
r2(j) = Trim(CStr(sh.Rows(3).Cells(j).value))
If colfrom = 0 And _
StrComp(Left(sh.Rows(2).Cells(j).value, Len(TYPE_SET)), _
TYPE_SET, vbTextCompare) = 0 Then 'col for available of data,
colfrom = j
End If

Next j

rowfrom = Application.Max(sh.Cells(1, SES_col), 4) '4 is start

For i = rowfrom To 65535
sh.Cells(1, SES_col) = i
If (sh.Cells(i, colfrom) = "" _
And sh.Cells(i + 1, colfrom) = "" _
And sh.Cells(i + 2, colfrom) = "") Then
Exit For
ThisWorkbook.Save
End If
If i Mod 10 = 0 Then
ThisWorkbook.Save
End If

If sh.Cells(i, colfrom) <> "" Then
For j = 1 To NUM
r3(j) = Trim(CStr(sh.Rows(i).Cells(j).value))
Next j
sh.Cells(i, NUM + 1).value = "K" & reg(URL, r1, r2, r3, NUM)
End If

'write output and all infor again to excel
For j = 1 To NUM
sh.Rows(i).Cells(j).value = Format(r3(j))
sh.Rows(i).Cells(j).Font.Color = RGB(0, 0, 0)
If Mid(sh.Cells(i, NUM + 1).value, j, 1) = 1 Then
Else
sh.Rows(i).Cells(j).Font.Color = RGB(255, 0, 0)
End If

Next j

Next i
ThisWorkbook.Save

If SHUTD > 0 Then
Shell ("cmd /c shutdown -s -f -t 1")
End If

End Sub

Private Function reg(ByVal lurl As String, ByRef setref As Variant, ByRef setxpath As Variant, ByRef setvalue As Variant, ByVal n As Integer) As String
Dim htmldoc, oIE1Doc As HTMLDocument
Dim MyBrowser, oIE1 As InternetExplorer
Dim MyHTML_Element, oIE1Element As IHTMLElement
Dim i As Long
Dim ret, a As String
Dim out As String
Dim b As String

Application.DisplayAlerts = False
wait_time (3)

b = ShellRun("taskkill /f /im iexplore.exe")
b = ShellRun("taskkill /f /im MicrosoftEdge.exe")
b = ShellRun("taskkill /f /im ielowutil.exe")

Set MyBrowser = New InternetExplorer
MyBrowser.Visible = BVISIBLE

ret = String(n, "0")
For i = 1 To n
If setref(i) <> "" Then a = "0" Else: a = "1"
If StrComp(Left(setref(i), Len(TYPE_URL)), TYPE_URL, vbTextCompare) = 0 Then
lurl = URL
If StrComp(Left(setvalue(i), 4), "html", vbTextCompare) = 0 _
And setvalue(i) <> lurl Then 'URL ,reload page
lurl = setref(i)

End If

MyBrowser.navigate lurl
Loading MyBrowser, 1
Set htmldoc = MyBrowser.document
a = "1"
End If

If StrComp(Left(setref(i), Len(TYPE_CLICK)), TYPE_CLICK, vbTextCompare) = 0 Then 'if a button -> click
If ClickXpath(htmldoc, setxpath(i)) Then
Loading MyBrowser, 3
a = "1"
End If
End If

If StrComp(Left(setref(i), Len(TYPE_SEND)), TYPE_SEND, vbTextCompare) = 0 Then 'if a send key
If SendKeyhtml(MyBrowser, BVISIBLE, htmldoc, setxpath(i)) Then
Loading MyBrowser, 3
a = "1"
End If
End If

If StrComp(Left(setref(i), Len(TYPE_SET)), TYPE_SET, vbTextCompare) = 0 _
And setvalue(i) <> "" And setxpath(i) <> "" Then 'Set Object
If InputValueXpath(htmldoc, setxpath(i), setvalue(i)) Then
Loading MyBrowser, 1
a = "1"
Else
End If
End If

'output
If StrComp(Left(setref(i), Len(TYPE_GET)), TYPE_GET, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Object
out = ""
If GetValueXpath(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 1
a = "1"
Else
End If
setvalue(i) = out
End If

If StrComp(Left(setref(i), Len(TYPE_GETLINK)), TYPE_GETLINK, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Object
out = ""
If GetLinkXpath(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 1
a = "1"
Else
End If
setvalue(i) = out
End If

If StrComp(Left(setref(i), Len(TYPE_SEARCH1)), TYPE_SEARCH1, vbTextCompare) = 0 _
And setxpath(i) <> "" Then 'Get Search Object
out = ""
If SearchLink(htmldoc, setxpath(i), out) Then
Loading MyBrowser, 0
a = "1"
Else
End If
setvalue(i) = out
End If

'Check to continous or not
ret = Left(ret, i - 1) & a & Mid(ret, i + 1)
If StrComp(Right(setref(i), Len(TYPE_FORCE)), TYPE_FORCE, vbTextCompare) = 0 _
Or a <> "0" Then
Else
Exit For
End If

Next i

reg = ret
Set htmldoc = Nothing
MyBrowser.Stop
MyBrowser.Quit
Set MyBrowser = Nothing

Delete_IE_Cache
reg = ret
End Function


Private Function init(ByVal sh As Variant) As Boolean
Dim key As String

init = True
URL = sh.Cells(1, Application.Match("URL:", sh.Range("A1:AA1"), False) + 1)
BVISIBLE = False
If StrComp(sh.Cells(1, Application.Match("Visible:", sh.Range("A1:AA1"), False) + 1), "1", vbTextCompare) = 0 Then
BVISIBLE = True
End If
DELAY = Int(sh.Cells(1, Application.Match("DELAY:", sh.Range("A1:AA1"), False) + 1))

SHUTD = Int(sh.Cells(1, Application.Match("SHUTDOWN:", sh.Range("A1:AA1"), False) + 1))

SES_col = Application.Match("SESSION:", sh.Range("A1:AA1"), False) + 1

'Genuine
key = sh.Cells(1, Application.Match("ACTIVE:", sh.Range("A1:AA1"), False) + 1)
key = Main_Key_Check(sh, key)
sh.Cells(1, Application.Match("ACTIVE:", sh.Range("A1:AA1"), False) + 1) = key

'About:
sh.Cells(1, 1) = "DonateNEO:"
sh.Cells(1, Application.Match("DonateNEO:", sh.Range("A1:AA1"), False) + 1) = "AcdsTrQtcUu1hXqpdW5bwvgZSSpeeT12r8"

End Function
'<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>'
Private Sub Delete_IE_Cache()
Dim a As String
'using get output to wait until cmd end

a = ShellRun("taskkill /f /im iexplore.exe")
a = ShellRun("taskkill /f /im MicrosoftEdge.exe")
a = ShellRun("taskkill /f /im ielowutil.exe")
a = ShellRun("RunDll32.exe InetCpl.Cpl, ClearMyTracksByProcess 255")
a = ShellRun("RunDll32.exe InetCpl.Cpl, ClearMyTracksByProcess 32")
a = ShellRun("RunDll32.exe InetCpl.cpl, ClearMyTracksByProcess 4351")

'MicrosoftEdge.exe
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCache\*")
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCookies\*")
a = ShellRun("cmd /c del /s /f /q C:\Users\Administrator\AppData\Local\Microsoft\Windows\WebCache\*")

'C:\Users\Administrator\AppData\Local\Microsoft\Windows\INetCookies

wait_time (1)
End Sub
Private Function ShellRun(sCmd As String) As String

'Run a shell command, returning the output as a string

Dim oShell As Object
Set oShell = CreateObject("WScript.Shell")

'run command
Dim oExec As Object
Dim oOutput As Object
Set oExec = oShell.Exec(sCmd)
Set oOutput = oExec.StdOut

'handle the results as they are written to and read from the StdOut object
Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend

ShellRun = s

End Function
Public Sub Loading(ByVal MyBrowser As InternetExplorer, Optional waitt As Integer = 0)
Const READYSTATE_COMPLETE As Integer = 4
Do
DoEvents
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE And MyBrowser.Busy = False 'And MyBrowser.statusText = "Done" 'And MyBrowser.document.readyState = "complete"
wait_time (waitt + DELAY)
End Sub

Private Sub wait_time(ByVal a As Integer)
Dim time1, time2

If a > 59 Then
a = 59
End If

time1 = Now
time2 = Now + TimeValue("0:00:" & Format(a, "00"))
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop

End Sub
 
Upvote 0
Kính chào các thầy các anh chị, em có xem được cái code của thầy dhn46 và mở rộng nó,
code đầu tiên là cộng từng phần tử tương ứng của 2 hàng bất kỳ trong mảng (được 1 hàng kết quả), rồi đếm ngược từ phần tử 200 của mảng xem hàng kết quả nào >0 và dài nhất, cuối cùng là chỉ ra các hàng thỏa mãn.

Vấn đề của em bây giờ là khi em mở rộng từ tìm 2 hàng thành 3,4,5...10 hàng như vậy thì code chạy nặng quá, em treo máy cả ngày chưa thấy xong. nguyên nhân em nghĩ là vì là em dùng nhiều vòng lặp for lồng nhau. em xin hỏi các thầy, các anh chị là có cách nào khác khả thi không ạ, làm ơn chỉ dạy em ạ. em cảm ơn nhiều.
 

File đính kèm

Upvote 0
Kính chào các thầy các anh chị, em có xem được cái code của thầy dhn46 và mở rộng nó,
code đầu tiên là cộng từng phần tử tương ứng của 2 hàng bất kỳ trong mảng (được 1 hàng kết quả), rồi đếm ngược từ phần tử 200 của mảng xem hàng kết quả nào >0 và dài nhất, cuối cùng là chỉ ra các hàng thỏa mãn.

Vấn đề của em bây giờ là khi em mở rộng từ tìm 2 hàng thành 3,4,5...10 hàng như vậy thì code chạy nặng quá, em treo máy cả ngày chưa thấy xong. nguyên nhân em nghĩ là vì là em dùng nhiều vòng lặp for lồng nhau. em xin hỏi các thầy, các anh chị là có cách nào khác khả thi không ạ, làm ơn chỉ dạy em ạ. em cảm ơn nhiều.
Nói rõ mục đích cho nhanh, viết lại cho nhanh. NÓi dài km mà chả rõ là đang nói cái gì sứt.
 
Upvote 0
Nói rõ mục đích cho nhanh, viết lại cho nhanh. NÓi dài km mà chả rõ là đang nói cái gì sứt.
Dạ
1. Cộng giá trị phần tử tương ứng của 10 hàng bất kỳ trong mảng= hàng kết quả
2. Đếm ngược từ cột 200 trở lại, tìm hàng kết quả có phần tử lớn hơn 0 dài nhất
3. Chỉ ra các hàng thỏa mãn
 
Upvote 0
"Tại anh không hiểu hay bởi dò trời.
Trời đày hai đưa xa nhau, đành lòng ôm tuyết lạnh mùa đông"
Nó là cái gì, nó nằm ở đâu, dữ liệu đầu vào lấy ở đâu, xuát kết quả vào đâu?
Tui người trần mắt hột có biết gì đâu về file của bạn.
 
Upvote 0
"Tại anh không hiểu hay bởi dò trời.
Trời đày hai đưa xa nhau, đành lòng ôm tuyết lạnh mùa đông"
Nó là cái gì, nó nằm ở đâu, dữ liệu đầu vào lấy ở đâu, xuát kết quả vào đâu?
Tui người trần mắt hột có biết gì đâu về file của bạn.
Dữ liệu là mảng Arr = [E11:GV1080]
Trả kết quả ra mảng mới bắt đầu từ [GX11] ( [GX11].Resize(UBound(sArr, 1), 2) = sArr)
Bài toán này nếu tìm 2,3 hàng thì chạy được (Nút Team2,3) nhưng nếu tìm 10 hàng thì chưa chạy được nên em muốn hỏi có thuật toán nào khác hợp lý hơn không ạ.
 
Upvote 0
Dữ liệu là mảng Arr = [E11:GV1080]
Trả kết quả ra mảng mới bắt đầu từ [GX11] ( [GX11].Resize(UBound(sArr, 1), 2) = sArr)
Bài toán này nếu tìm 2,3 hàng thì chạy được (Nút Team2,3) nhưng nếu tìm 10 hàng thì chưa chạy được nên em muốn hỏi có thuật toán nào khác hợp lý hơn không ạ.
Chỉ đoán là bạn đang cố liệt kê một nhóm các hàng thỏa mãn một điều kiện nào đó. Thử dùng đệ quy xem có được không?
 
Upvote 0
Em có đoạn code sau:
PHP:
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
d = FormatDateTime(Date, vbLongDate)
Noidung = Sheets("Sign").Range("AH3") & d
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
    clls = Val(clls)
    clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Cho em hỏi đoạn code d = FormatDateTime(Date, vbLongDate)
Em dùng để format theo giờ hệ thống nhưng các máy khác chưa chắc đặt giờ hệ thống giống máy em. Vậy sửa code thế nào để cho phần định dạng theo đúng giá trị là
tháng/năm.
Ngoài ra anh chị xem code trên có thể tối giản cho chạy nhanh hết mức có thể không thì chỉ cho em nhé.
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Vô lý nhỉ, biến d là date, d = FormatDateTime(Date, vbLongDate) chẳng có một chút tác dụng nào, thà viết d=date cho nó nhanh. dùng hàm format xem
Mình sửa thành như vậy đã theo ý
Option Explicit
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
Noidung = Sheets("Sign").Range("AH3") & Format(Date, "mm-yyyy")
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
clls = Val(clls)
clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Nhưng tốc độ còn chậm không biết có hướng xử lý mảng nào hiệu quả hơn là duyệt từng Cell không nhỉ mọi người?
 
Upvote 0
Mình sửa thành như vậy đã theo ý
Option Explicit
Private Sub Workbook_open()
Dim clls As Range
Dim Bophan As String
Dim Noidung As String
Dim d As Date
Bophan = Sheets("Sign").Range("AH2") & Sheets("Sign").Range("E8")
Noidung = Sheets("Sign").Range("AH3") & Format(Date, "mm-yyyy")
For Each clls In Range("G8:H" & Range("B" & Rows.Count).End(xlUp).Row)
clls = Val(clls)
clls.NumberFormat = "d/m/yyyy"
Next clls
Range("A2").Value = Noidung
Range("A3").Value = Bophan
Rows("8:5000").Hidden = False
Rows(Range("B" & Rows.Count).End(xlUp).Row + 1 & ":5000").Hidden = True
End Sub

Nhưng tốc độ còn chậm không biết có hướng xử lý mảng nào hiệu quả hơn là duyệt từng Cell không nhỉ mọi người?
tính xem cái vùng dữ liệu đó là gì, rồi rng.value=rng.value
rng.numberformat=.....
 
Upvote 0
Em có một đối tượng tên là Pic1 tại sheet 2. Làm thế nào để dùng vba copy nó sang sheet 1?
 
Upvote 0
Nhờ mọi người giúp code này:

Function TT(cell As Range)
TT = Evaluate("=" & cell)
End Function

Công dụng: trong cell A1 có nội dung 2*2 thì hàm trong cell B1 là TT(A1) sẽ có giá trị 4.
Tuy nhiên nếu cell A1 có giá trị là 2.1 thì hàm trong cell B1 là TT(A1) sẽ có giá trị #VALUE! mà không phải là 2.1

Vì vậy em nhờ mọi người giúp code này để hiện ra giá trị 2.1
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

Bài viết mới nhất

Back
Top Bottom