Hỏi đáp về VBA (1 người xem)

Liên hệ QC

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

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,443
Nghề nghiệp
Bác sĩ
Câu hỏi 1 : Lấy giá trị của ô trong VB như thế nào ?

Hỏi :

Dùng Refedit, khi người dùng chọn 1 ô nào đó rồi, không biết làm sao để lấy giá trị của ô đó, help me...

Mình đã biết hàm Cells(x,y) để lấy giá trị của một ô, nhưng khi dùng refedit thì giá trị của refedit là Data!$A$5.
Vậy nếu dùng Cells thì phải có toạ độ dòng của ô A5, nên cần phải xử lý chuỗi để lấy được chữ "A" và số "5".

Nếu dùng Rows hay Columns thì cũng phải có toạ độ dòng và cột, như vậy cũng bằng không.

Mình làm được như vậy, nhưng rắc rối quá.
Các bạn có biết hàm nào để lấy thẳng giá trị của ô đó không chỉ cho mình, nghĩa là lấy thẳng gía trị của ô mà người dùng chọn trong Refedit, mà khong phải xử lý chuỗi để lấy cột và dòng.

Trả lời :

Giả sử trong Form của bạn có control "RefEdit" đặt tên là RefEdit1 (đối tượng lấy địa chỉ ô hay vùng có kiểu là Text).
Để lấy giá trị Range(RefEdit1.Text).Value
Để lấy công thức Range(RefEdit1.Text).Formula
Để lấy cột bạn Range(RefEdit1.Text).Column
Để lấy dòng bạn Range(RefEdit1.Text).Row
Để lấy số cột Range(RefEdit1.Text).Columns.Count
Để lấy số dòng Range(RefEdit1.Text).Rows.Count
Nếu không đúng mục đích của bạn thì bạn giải thích thêm yêu cầu của bạn.
Chúc bạn thành công!
 
Running Macro từ Cell của Worksheet ?

Câu hỏi 2 : Có thể running Macro từ Cell của Worksheet ?

Hỏi : Tôi muốn hỏi cách viết một hàm UDF giống như : =IF(A1>10,Macro1), để điều khiển Macro từ Cell A1 ?

Trả lời : Bạn có thể viết hàm như sau đặt trong Module :

Mã:
[B]Public Function RunMaCro(ByVal Macro_Name As String, ByVal Arg1 As Variant)[/B]
RunMaCro = Application.Run(Macro_Name, Arg1)
[B]End Function[/B]
Dĩ nhiên Macro của bạn là :

PHP:
Sub My_Macro(ByVal sMessage As String)
MsgBox sMessage, vbOKOnly, "www.giaiphapExcel.com"
End Sub

Gọi hàm từ Cell A2 :

=IF(A1>2,(RunMaCro("My_Macro","Giá trị lớn hơn 2, hãy xem lại !")),"nhỏ hơn 2")

Bạn có thể thêm nhiều đối số vào hàm trên (thí dụ ByVal Arg1 As Variant, ByVal Arg2 As Variant, ...)

Giới hạn của phương thức này là bạn không thể gọi Macro để thay đổi, update các thuộc tính về màu sắc, kích thước của Cell...
 
Upvote 0
Câu hỏi 3 : phương pháp nào đếm được số ô tô màu trong excel không?

Hỏi: Em có 12 cột trong Excel, trong số đó: 4 cột để ở màu vàng, 4 cột để ở màu xanh, 4 cột để ở màu tím, 4 cột định dạng ở màu nâu.
Có bác nào biết cách dùng lệnh trong excel để đếm được số cột theo từng màu không?


Trả lời:

1.Bạn thử macro sau:

Mã:
[B]Sub CellColor()[/B]
 Dim uRange As Range, cCell As Range
 Dim Num As Long
 On Error Resume Next
 Set uRange = ActiveSheet.UsedRange
 If uRange Is Nothing Then
    MsgBox ("Khong co du lieu trong sheet " & ActiveSheet.Name)
    Exit Sub
 End If
 Num = 0
 For Each cCell In uRange
    If cCell.Interior.ColorIndex <> xlNone Then Num = Num + 1
 Next cCell
 If Num = 0 Then
    MsgBox ("Khong co o nao to mau trong sheet " & ActiveSheet.Name)
 Else
    MsgBox ("Co " & Num & " o duoc to mau trong sheet " & ActiveSheet.Name)
 End If
[B]End Sub[/B]

(answered by Adam_tran)

2.Cách làm đơn giản thôi, nhưng phải là VBA.

Viết một các function như là:
========================
PHP:
Function vbaRed() as Long
 vbaRed=vbRed
End Function

PHP:
Function vbaBlue() as Long
 vbaBlue=vbBlue
End Function
.......


Có thể viết 16 hàm màu tương ứng với 16 màu cơ bản

PHP:
Function Getcolor(Byval ColorCell as Range) As Long
 Getcolor=ColorCell.Color........
End Function
========================


Bây giờ trên các Sheet ta có thể dùng công thức như là:
=IF(Getcolor(A1)=vbaBlue(),"Mau xanh",Getcolor(A1)=vbaRed(),"Mầu đỏ",...,""))


Công thức mảng đếm số ô có màu xanh là:
{=Count(IF(Getcolor($A$1:$A$100)=vbaBlue(),1,""))}


(answered by Tuanktcdcn)
 
Lần chỉnh sửa cuối:
Upvote 0
Câu hỏi 4 : Dừng tính toán khi chạy macro

Hỏi: Có cách nào cho Excel dừng tính toán trong lúc chạy macro. Có thể cho nó dừng tính toàn bảng tính rồi lại cho nó tiếp tục tính không?. Nhưng trong lúc yêu cầu dừng tính có thể bảo nó chỉ tính một ô chỉ định không?

Trả lời: bạn dùng
Application.Calculation = xlCalculationManual
Sau khi thực hiện xong các Macro thì
Application.Calculation = xlCalculationAutomatic


Việc bạn muốn Excel tự tính riêng cho một Hàm tại một ô (ví dụ A1) thì dùng lệnh Range("A").Calculate

Chúc bạn thành công!

(answered by Tuanktcdcn)



Câu hỏi 5: Lấy dữ liệu từ một workbook khác

Hỏi: Các bác cho em hỏi làm sao để lấy dữ liệu từ một Workbook khác vì khi em dùng các lệnh Paste link hay offset từ một workbook đang mở thì được nhưng khi đóng workbook đó đi thì tại ô có chứa công thức báo lỗi #VALUE.

Trả lời:

Dùng macro4 để lấy giá trị từ 1 cell của closed WB

Option Explicit

Sub thu1()
MsgBox ExecuteExcel4Macro("'E:/[datasource.xls]Sheet1'!R1C1")
End Sub


Sub thu2()
ActiveCell.Value = ExecuteExcel4Macro("'E:/[datasource.xls]Sheet1'!R1C1")
End Sub

Sub thu3()
Dim Pathfile As String
Pathfile = "'E:/[datasource.xls]Sheet1'!"
ActiveCell.Value = ExecuteExcel4Macro(Pathfile & "R1C1")
End Sub

P/s: SG sửa dấu "\" thành "/" để nó không hiển thị smiling icon!

(answered by Tran Chau)​
 
Upvote 0
Secret_grasses đã viết:
Câu hỏi 5: Lấy dữ liệu từ một workbook khác

Hỏi: Các bác cho em hỏi làm sao để lấy dữ liệu từ một Workbook khác vì khi em dùng các lệnh Paste link hay offset từ một workbook đang mở thì được nhưng khi đóng workbook đó đi thì tại ô có chứa công thức báo lỗi #VALUE.

Trả lời:

Dùng macro4 để lấy giá trị từ 1 cell của closed WB

Mã:
Option Explicit
 
[B]Sub thu1()[/B]
MsgBox ExecuteExcel4Macro("'E:[B][COLOR=red]/[/COLOR][/B][datasource.xls]Sheet1'!R1C1") 
[B]End Sub[/B][/COLOR]

Mã:
[B]Sub thu2[/B]()
ActiveCell.Value = ExecuteExcel4Macro("'E:[COLOR=red][B]/[/B][/COLOR][datasource.xls]Sheet1'!R1C1")
[B]End Sub[/B]

Mã:
[B]Sub thu3()[/B]
Dim Pathfile As String
Pathfile = "'E:[COLOR=red][B]/[/B][/COLOR][datasource.xls]Sheet1'!"
ActiveCell.Value = ExecuteExcel4Macro(Pathfile & "R1C1")
[B]End Sub[/B]
P/s: SG sửa dấu "\" thành "/" để nó không hiển thị smiling icon!

(answered by Tran Chau)​



Cách này có được không:
Option Explicit

'***Copy a range from each workbook (you can select the files yourself)***

'This two examples will copy Range("A1:C1") from the first sheet of each workbook
'You can select the files yourself with GetOpenFilename.
'(hold the CTRL key when you select the files)
'Change the folder "C:\Data" 0r "\\ComputerName\YourFolder" to your folder.

'Note: Example6 is also working if your files are in a network folder.
'Note: Example6 use the function and the sub ChDirNet because ChDrive
' and ChDir is not working if your files are in a network folder.

Private Declare Function SetCurrentDirectoryA Lib _
"kernel32" (ByVal lpPathName As String) As Long
========================
Mã:
[B]Public Sub ChDirNet(szPath As String)[/B]
' Rob Bovey
    Dim lReturn As Long
    lReturn = SetCurrentDirectoryA(szPath)
    If lReturn = 0 Then Err.Raise vbObjectError + 1, "Error setting path."
[B]End Sub[/B]
==================================
PHP:
Sub Example5()
    Dim basebook As Workbook
    Dim mybook As Workbook
    Dim sourceRange As Range
    Dim destrange As Range
    Dim SourceRcount As Long
    Dim N As Long, rnum As Long
    Dim MyPath As String, SaveDriveDir As String
    Dim FName As Variant

    SaveDriveDir = CurDir
    MyPath = "E:\N - T\THUE 06\" ''
    ChDrive MyPath
    ChDir MyPath

    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xls), *.xls", _
                                        MultiSelect:=True)
    If IsArray(FName) Then
        Application.ScreenUpdating = False
        Set basebook = ThisWorkbook
        rnum = 1
        basebook.Worksheets.Add before:=basebook.Worksheets(1)
        'clear all cells on the first sheet'

        For N = LBound(FName) To UBound(FName)
            Set mybook = Workbooks.Open(FName(N))
            Set sourceRange = mybook.Worksheets("NKC").Range("A1:z4000")
            SourceRcount = sourceRange.Rows.Count
            Set destrange = basebook.Worksheets(1).Cells(rnum, "A")

            basebook.Worksheets(1).Cells(rnum, "D").Value = mybook.Name
            ' This will add the workbook name in column D if you want'
            sourceRange.Copy destrange
            ' Instead of this line you can use the code below to copy only the values'

                    With sourceRange
                        Set destrange = basebook.Worksheets(1).Cells(rnum, "A"). _
                                                     Resize(.Rows.Count, .Columns.Count)
                    End With
                    destrange.Value = sourceRange.Value

            mybook.Close False
            rnum = rnum + SourceRcount
        Next
    End If
    ChDrive SaveDriveDir
    ChDir SaveDriveDir
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
xin chào các anh chị. Em có thắc mắc này mà chưa tìm ra câu trả lời, mong các anh chị bớt chút thời gian chỉ giùm cho.
Viết Code trong Module và viết Code trong Sheet thì khác nhau ở chỗ nào?
ai có thể cho em một ví dụ cụ thể thật đơn giản để thực hành viết code và sử dụng nó không ạ. Em đã xem nhiều code rồi mà chưa biết sử dụng chúng như thế nào cả. Em xin chân thành cảm ơn!!!!
 
Upvote 0
Code trong Module và viết Code trong Sheet thì khác nhau ở chỗ nào? class dùng ntn
 
Upvote 0
Viết Code trong Module thì dùng chung cho các Sheet có trong File, còn viết Code trong Sheet thì chỉ dùng riêng cho Sheet đó.
 
Upvote 0
Viết Code trong Module thì dùng chung cho các Sheet có trong File, còn viết Code trong Sheet thì chỉ dùng riêng cho Sheet đó.
Phát biểu này là không đúng đâu nha!
Tôi có thể viết code ở sheet1 mà vẫn dùng được ở sheet2 đấy. Bạn tin không?
 
Upvote 0
Phát biểu này là không đúng đâu nha!
Tôi có thể viết code ở sheet1 mà vẫn dùng được ở sheet2 đấy. Bạn tin không?
Ở sheet1 mình có đoạn code như vầy
PHP:
Sub callcode()
MsgBox "hung"
End Sub
Sang sheet2 mình gọi đoạn code sheet1 lên bằng câu lệnh này không biết có đúng anh?
PHP:
Sub callcode1()
Sheet1.callcode
End Sub
 
Upvote 0
Ở sheet1 mình có đoạn code như vầy
PHP:
Sub callcode()
MsgBox "hung"
End Sub
Sang sheet2 mình gọi đoạn code sheet1 lên bằng câu lệnh này không biết có đúng anh?
PHP:
Sub callcode1()
Sheet1.callcode
End Sub
Chỉ cần bạn đừng ghi chữ "Private" vào sub, sang sheet khác, bấm Alt + F8 là hoàn toàn có thể gọi sub từ sheet kia rồi
 
Upvote 0
tại sao mình chạy nó lại báo lỗi tại dòng Getcolor=ColorCell.Color........ .
 
Upvote 0
Câu hỏi 3 : phương pháp nào đếm được số ô tô màu trong excel không?

Hỏi: Em có 12 cột trong Excel, trong số đó: 4 cột để ở màu vàng, 4 cột để ở màu xanh, 4 cột để ở màu tím, 4 cột định dạng ở màu nâu.
Có bác nào biết cách dùng lệnh trong excel để đếm được số cột theo từng màu không?


Trả lời:

1.Bạn thử macro sau:

Mã:
[B]Sub CellColor()[/B]
 Dim uRange As Range, cCell As Range
 Dim Num As Long
 On Error Resume Next
 Set uRange = ActiveSheet.UsedRange
 If uRange Is Nothing Then
    MsgBox ("Khong co du lieu trong sheet " & ActiveSheet.Name)
    Exit Sub
 End If
 Num = 0
 For Each cCell In uRange
    If cCell.Interior.ColorIndex <> xlNone Then Num = Num + 1
 Next cCell
 If Num = 0 Then
    MsgBox ("Khong co o nao to mau trong sheet " & ActiveSheet.Name)
 Else
    MsgBox ("Co " & Num & " o duoc to mau trong sheet " & ActiveSheet.Name)
 End If
[B]End Sub[/B]

(answered by Adam_tran)

2.Cách làm đơn giản thôi, nhưng phải là VBA.

Viết một các function như là:
========================
PHP:
Function vbaRed() as Long
 vbaRed=vbRed
End Function

PHP:
Function vbaBlue() as Long
 vbaBlue=vbBlue
End Function
.......


Có thể viết 16 hàm màu tương ứng với 16 màu cơ bản

PHP:
Function Getcolor(Byval ColorCell as Range) As Long
 Getcolor=ColorCell.Color........
End Function
========================


Bây giờ trên các Sheet ta có thể dùng công thức như là:
=IF(Getcolor(A1)=vbaBlue(),"Mau xanh",Getcolor(A1)=vbaRed(),"Mầu đỏ",...,""))


Công thức mảng đếm số ô có màu xanh là:
{=Count(IF(Getcolor($A$1:$A$100)=vbaBlue(),1,""))}


(answered by Tuanktcdcn)
tại sao mình lại chạy không được nhỉ, nó báo lỗi ở dòng Getcolor=ColorCell.Color........, đổi lại Getcolor=ColorCell.Color cũng không được
 
Upvote 0
tại sao mình lại chạy không được nhỉ, nó báo lỗi ở dòng Getcolor=ColorCell.Color........, đổi lại Getcolor=ColorCell.Color cũng không được

Bạn chạy ở đâu cái này là function dùng giống các hàm như hàm sum của excel chẳng hạn được nói bạn chạy trong module
 
Upvote 0
mấy anh xem giùm em
Private Sub Cmdsearch_Click()
Dim Search As String, Where
Search = TextBox1.Text
Where = InStr(TextBox1.Text, Search)
If Where = 0 Then
MsgBox "XIN VUI LONG NHAP TEN CAN TIM", , " MESSAGE"
Exit Sub
End If

If Where > 0 Then
Cells.Find(What:=Search, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Else
MsgBox " XIN LOI VI KHONG TIM THAY, CAM ON BAN", , "MESSAGE"
End If
End Sub

sai chổ nào sửa giùm em
nó chạy nhưng khi tìm ko ra nó báo lỗi
 
Upvote 0
mấy anh xem giùm em
sai chổ nào sửa giùm em
nó chạy nhưng khi tìm ko ra nó báo lỗi

thử vậy xem
bạn search thêm topic find method của site này
Mã:
Private Sub Cmdsearch_Click()

Dim Search As String, Where
Dim timkiem As Range
Search = TextBox1.Text
Where = InStr(TextBox1.Text, Search)
If Where = 0 Then
MsgBox "XIN VUI LONG NHAP TEN CAN TIM", , " MESSAGE"
Else
Set timkiem = Cells.Find(What:=Search, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
    If Not timkiem Is Nothing Then
        timkiem.Select
    Else
        MsgBox " XIN LOI VI KHONG TIM THAY, CAM ON BAN", , "MESSAGE"
    End If
End If
End Sub
 
Upvote 0
thử vậy xem
bạn search thêm topic find method của site này
Mã:
Private Sub Cmdsearch_Click()

Dim Search As String, Where
Dim timkiem As Range
Search = TextBox1.Text
Where = InStr(TextBox1.Text, Search)
If Where = 0 Then
MsgBox "XIN VUI LONG NHAP TEN CAN TIM", , " MESSAGE"
Else
Set timkiem = Cells.Find(What:=Search, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
    If Not timkiem Is Nothing Then
        timkiem.Select
    Else
        MsgBox " XIN LOI VI KHONG TIM THAY, CAM ON BAN", , "MESSAGE"
    End If
End If
End Sub

nếu muốn tìm trong cột D không thì sửa code lại sao anh
 
Upvote 0
Nếu muốn tìm trong cột D không thì sửa code lại sao anh

PHP:
Set TimKiem = Columnls("D:D").Find(What:=Search, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns)

Bạn thử câu lệnh này xem sao?
 
Upvote 0
Private Sub Cmdsearch_Click()

Dim Search As String, Where
Dim timkiem As Range
Search = TextBox1.Text
Where = InStr(TextBox1.Text, Search)
If Where = 0 Then
MsgBox "XIN VUI LONG NHAP TEN CAN TIM", , " MESSAGE"
Else
Set timkiem = Columns("D:D").Find(What:=Search, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not timkiem Is Nothing Then
timkiem.Select
Else
MsgBox " XIN LOI VI KHONG TIM THAY, CAM ON BAN", , "MESSAGE"
End If
End If
End Sub

để chuột ở cột D thì tìm được còn cột khác nó báo lỗi
 
Upvote 0
bạn sửa lại lệnh Find một chút
Mã:
Set timkiem = [D1:D1000].Find(Search, , , xlWhole)

mà mục đích của bạn khi dùng hàm InStr là để làm gì vậy?

em lại làm phiền anh nữa rồi
vì cột D nó gồm nhiều dữ liệu
nên nếu nó nằm ở sau kết quả cần tìm sẽ chạy rất lâu
để cải thiện anh viết code lại cho về đầu cột D rồi tìm dc ko anh
xin chân thành cảm ơn anh! em mới tìm hiểu về code nên ko biết tí gì cả mong anh thông cảm
em chỉ tìm trên mạng thôi em ko biết gì về inStr cả
 
Lần chỉnh sửa cuối:
Upvote 0
em lại làm phiền anh nữa rồi

nên nếu nó nằm ở sau kết quả cần tìm sẽ chạy rất lâu

tôi không hiểu bạn hỏi gì, cái gì nằm sau kết quả cần tìm???

============
bạn cứ thoải mái trao đổi, tôi cũng như bạn thôi, cứ dzọc riết thì biết chút đỉnh, đủ viết code tự xài
.hihì
 
Upvote 0
ô làm việc đang nằm ở ô d115 nhưng kết quả đang ở ô d10 nó sẽ chạy từ d115 trở xuống ko có nó mới tìm từ d1
cho nên sẽ rất chậm, nếu tìm ngay từ đầu ô d1 sẽ nhanh hơn
 
Upvote 0
ô làm việc đang nằm ở ô d115 nhưng kết quả đang ở ô d10 nó sẽ chạy từ d115 trở xuống ko có nó mới tìm từ d1
cho nên sẽ rất chậm, nếu tìm ngay từ đầu ô d1 sẽ nhanh hơn

tôi không thực sự hiểu bạn hỏi gì lắm, tôi chưa gặp vấn đề tốc độ tìm kiếm bằng find methode, nó tìm rất nhanh.
==============
theo như câu lệnh trên, thì vùng tìm kiếm sẻ là [d1:d1000], tức là nó sẻ tìm từ D2:d1000, bạn có thể thay đổi cho phù hợp với nhu cầu của bạn.
.....................................
nếu có cao thủ đi qua, giúp bạn sẻ rỏ hơn
thân
 
Upvote 0
cảm ơn bạn nhiều nhe
mình còn mới tìm hiểu về code
ví dụ: ô c1 ở sheet 2 =sheet1!a1
ô b1 ở sheet 2 =sheet1!b1
tức là a1 sét 1 đánh chữ tuan thì c1 sét 2 có chữ tuan
b1 sét 1 đánh chữ tèo thì b1 sét 2 có chữ tèo
muốn viết bằng code thay vì dùng công thức trên phải làm sao
 
Upvote 0
cảm ơn bạn nhiều nhe
mình còn mới tìm hiểu về code
ví dụ: ô c1 ở sheet 2 =sheet1!a1
ô b1 ở sheet 2 =sheet1!b1
tức là a1 sét 1 đánh chữ tuan thì c1 sét 2 có chữ tuan
b1 sét 1 đánh chữ tèo thì b1 sét 2 có chữ tèo
muốn viết bằng code thay vì dùng công thức trên phải làm sao

bạn có thể sử dụng sự kiện worksheet change
trong đó có lệnh sheet2.[a1]=sheet1.[a1]
bạn hãy hình dung ra ý tưởng phải làm sao, rồi lên diễn đàn search
 
Upvote 0
Worksheet change là gì vậy có thể hướng dẫn cách thực hiện dc ko bạn

sao bạn ko sử dụng google?
bạn nhấn phím Alt F11 (mở cửa sổ VBA)
nhấp double vào sheet1
chép đoạn code này vào đó
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [A1:A10]) Is Nothing Then
            Sheet2.[a100].End(3).Offset(1) = Target
    End If
End Sub
=======
khi vào cửa sổ vba, bạn sẻ thấy box bên trái, nhấp vào đó bạn sẻ thấy có nhiều sự kiện (event)
nói chung bạn tìm và đọc trên diễn đàn này rất nhiều, ví dụ như cái này

http://www.giaiphapexcel.com/forum/showthread.php?45456-Ý-nghĩa-và-cách-dùng-các-sự-kiện-trong-VBA
 
Upvote 0
bạn ơi ko dc rồi
nó ko cố định rồi
vì nhập a1 sheet1 qua a2 sheet2
sửa dữ liệu ô a1 sheet1 nó hiện dữ liệu ô a3 sheet 2
 
Upvote 0
bạn ơi ko dc rồi
nó ko cố định rồi
vì nhập a1 sheet1 qua a2 sheet2
sửa dữ liệu ô a1 sheet1 nó hiện dữ liệu ô a3 sheet 2
Nếu chỉ tham chiếu như dạng công thức: Sheet2!F3 =Sheet1!A1, thì code viết: Sheet2.Range("F3") = Sheet1.Range("A1"), hoặc: Sheet2.[F3]=Sheet1.[A1]
Do sử dụng thuộc tính End, nên giá trị "không cố định" như theo cách nói của bạn. (Tham khảo Thuộc tính End).
Nếu tham chiếu đúng vị trí từng ô của sheet này với sheet khác thì tham khảo code sau:
[gpecode=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [A1:D10]) Is Nothing Then
Sheet2.Range(Target.Address) = Target
End If
End Sub
[/gpecode]
 
Upvote 0
ví dụ như file này thì sao bạn
 

File đính kèm

Upvote 0
vì bên sheet 2 các cột ko theo tứ tự sheet 1
sheet 2 như sau: cột a=cột d sheet 1, b=bsheét, c=csheet1, d=asheet1

chắc là vậy
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error Resume Next
    If Not Intersect(Target, [A1:D60000]) Is Nothing Then
            If Target.Column = 1 Then
                Sheet2.Range(Target.Address).Offset(, 3) = Target
            ElseIf Target.Column = 4 Then
                Sheet2.Range(Target.Address).Offset(, -3) = Target
            Else
                Sheet2.Range(Target.Address) = Target
            End If
    End If
Application.EnableEvents = True
On Error GoTo 0
End Sub
 
Upvote 0
đánh máy nhập quá sheet 2
copy hay kéo chuột nó ko qua bạn ơi
code sao nó tương đương công thức như a1 sheet1=a1 sheet2
 
Upvote 0
đánh máy nhập quá sheet 2
copy hay kéo chuột nó ko qua bạn ơi
code sao nó tương đương công thức như a1 sheet1=a1 sheet2

khó hỉ?
chép đoạn code này cho sheet2
Mã:
Private Sub Worksheet_Activate()
Sheet2.[A1].Resize(Sheet1.[D1000].End(3).Row).Value = Sheet1.[D1].Resize(Sheet1.[D1000].End(3).Row).Value
Sheet2.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value = Sheet1.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value
Sheet2.[D1].Resize(Sheet1.[A1000].End(3).Row).Value = Sheet1.[A1].Resize(Sheet1.[A1000].End(3).Row).Value
End Sub
 
Upvote 0
khó hỉ?
chép đoạn code này cho sheet2
Mã:
Private Sub Worksheet_Activate()
Sheet2.[A1].Resize(Sheet1.[D1000].End(3).Row).Value = Sheet1.[D1].Resize(Sheet1.[D1000].End(3).Row).Value
Sheet2.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value = Sheet1.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value
Sheet2.[D1].Resize(Sheet1.[A1000].End(3).Row).Value = Sheet1.[A1].Resize(Sheet1.[A1000].End(3).Row).Value
End Sub

phải nhấp chuột qua sheet2 mã mới chạy bạn ơi
có cách nào ko vào sheet2 vẫn chạy ko +-+-+-+
 
Upvote 0
phải nhấp chuột qua sheet2 mã mới chạy bạn ơi
có cách nào ko vào sheet2 vẫn chạy ko +-+-+-+

tôi không có cách nào,
hy vọng các cao thủ ghé qua giúp bạn,
tôi chỉ có một thắc mắc, bạn đưa nhưng số liệu y chang như vậy qua sheet2 để làm gì vậy?
ý tôi là bước kế tiếp bạn làm cái gì?
 
Upvote 0
Đưa số quyết định ra đầu để dò hàm vlookup theo số quyết định
 
Upvote 0
Đưa số quyết định ra đầu để dò hàm vlookup theo số quyết định

sao phải cực khổ vậy, để y như củ dùng index và match

=========
ví dụ cột F là cột số quyết định mà bạn sẻ đi tìm
G là họ tên
Mã:
G2=INDEX($A$2:$C$23,MATCH($F2,$D$2:$D$23,0),2)
H2=INDEX($A$2:$C$23,MATCH($F2,$D$2:$D$23,0),3)
I2=INDEX($A$2:$C$23,MATCH($F2,$D$2:$D$23,0),1)
 
Lần chỉnh sửa cuối:
Upvote 0
cột f là số quyết định
cột cần dò là phía trước cột f nên ko dùng vlookup dò dc (tìm cột a, b, c, d, e)
còn cột g thì dễ rồi
 
Upvote 0
ví dụ
m1=vlookup(n1,f1:k100,2,0)
vùng dò phải bắt đầu từ cột f trở về sau
 
Upvote 0
ví dụ
m1=vlookup(n1,f1:k100,2,0)
vùng dò phải bắt đầu từ cột f trở về sau

Dùng cột phụ đưa cột F ra trước rồi dùng Vlookup dò, còn ko dùng cộng thức của Gâu Gâu mà xử mà mở topic mới đi bạn bạn hỏi nên vào thẳng chủ đề mục đích làm gì để không đi lòng vòng mệt
 
Upvote 0
Dùng cột phụ đưa cột F ra trước rồi dùng Vlookup dò, còn ko dùng cộng thức của Gâu Gâu mà xử mà mở topic mới đi bạn bạn hỏi nên vào thẳng chủ đề mục đích làm gì để không đi lòng vòng mệt
bạn ơi cho hỏi chút dc ko?
có 2 sheet s1 để nhập liệu s2 để công thức vì để s1 sợ bị xóa nhầm
nên đoạn mã sau
Private Sub Worksheet_Activate()
Sheet2.[A1].Resize(Sheet1.[D1000].End(3).Row).Value = Sheet1.[D1].Resize(Sheet1.[D1000].End(3).Row).Value
Sheet2.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value = Sheet1.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value
Sheet2.[D1].Resize(Sheet1.[A1000].End(3).Row).Value = Sheet1.[A1].Resize(Sheet1.[A1000].End(3).Row).Value
End Sub
ở sheet2, ko muốn nhấp vào sheet2 nó vẫn chạy
 
Upvote 0
bạn ơi cho hỏi chút dc ko?
có 2 sheet s1 để nhập liệu s2 để công thức vì để s1 sợ bị xóa nhầm
nên đoạn mã sau
Private Sub Worksheet_Activate()
Sheet2.[A1].Resize(Sheet1.[D1000].End(3).Row).Value = Sheet1.[D1].Resize(Sheet1.[D1000].End(3).Row).Value
Sheet2.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value = Sheet1.[B1].Resize(Sheet1.[B1000].End(3).Row, 2).Value
Sheet2.[D1].Resize(Sheet1.[A1000].End(3).Row).Value = Sheet1.[A1].Resize(Sheet1.[A1000].End(3).Row).Value
End Sub
ở sheet2, ko muốn nhấp vào sheet2 nó vẫn chạy

Dùng sự kiện nhiều file quá file nào là gốc là chính giả sự 1 ít đi rồi giúp luôn cụ thể

Private Sub Worksheet_Change(ByVal Target As Range)


End Sub
 
Upvote 0
mấy anh chị có cách nào trong sheet2 cột d nếu ô nào =0 thì các công thức ở cột e, f, g.... khoản 100 cột
không thực hiện công thức
 
Upvote 0
Các ban sửa giùm cho mình đoạn code mà mình không biết sai chỗ nào, soạn ra không sử dụng được:

Sub timM()
Dim a, b, c, i, j, k As Integer
Cells(3, 3) = a
Cells(4, 3) = b
Cells(5, 3) = c
Cells(3, 4) = i
Cells(4, 4) = j
Cells(5, 4) = k
For nc = 0 To 999999# Step c
M = nc + k
If (M - i) Mod a = 0 Then
If (M - j) Mod b = 0 Then
Exit For
End If
End If
Next nc
Cells(7, 5) = M
End Sub
 

File đính kèm

Upvote 0
Các ban sửa giùm cho mình đoạn code mà mình không biết sai chỗ nào, soạn ra không sử dụng được:

Sub timM()
...
Cells(7, 5) = M
End Sub
Bạn cũng chơi ít ác nhỉ. Bắt người ta tự dịch ngược code rồi mới biết M là cái gì xong mới sửa...o_O
 
Upvote 0
tôi đổi lai rồi nhưng vẫn không thực hiện được phép tính
 
Upvote 0
tôi đổi lai rồi nhưng vẫn không thực hiện được phép tính
Thì đây, vẫn code của bạn.
Mã:
Sub timM()
Dim a, b, c, i, j, k As Integer
a = Cells(3, 3)
b = Cells(4, 3)
c = Cells(5, 3)
i = Cells(3, 4)
j = Cells(4, 4)
k = Cells(5, 4)
For nc = 0 To 999999# Step c
M = nc + k
If (M - i) Mod a = 0 Then
If (M - j) Mod b = 0 Then
Exit For
End If
End If
Next nc
Cells(7, 5) = M
End Sub
 

File đính kèm

Upvote 0
oh, sao nhỉ hay bản excel của mình có vấn đè. mở file của bạn là ăn ngay lạ quá????
Bài đã được tự động gộp:

cám ơn ban nhiều lắm
 
Upvote 0
Các ban cho mình hỏi tý, sau khi thực hiện xong đoạn code thì tự nhiên trên file của mình xuất hiện thêm 1 sheet, trong đó có nội dung như sau:
Compatibility Report for timso.xls
Run on 11/5/2023 22:17

If the workbook is saved in an earlier file format or opened in an earlier version of Microsoft Excel, the listed features will not be available.

Minor loss of fidelity # of occurrences Version

Some cells or styles in this workbook contain formatting that is not supported by the selected file format. These formats will be converted to the closest format available. 1 Excel 97-2003
Vậy, nó là gì mà mình không hiểu
 
Upvote 0
Các ban cho mình hỏi tý, sau khi thực hiện xong đoạn code thì tự nhiên trên file của mình xuất hiện thêm 1 sheet, trong đó có nội dung như sau:
Compatibility Report for timso.xls
Run on 11/5/2023 22:17

If the workbook is saved in an earlier file format or opened in an earlier version of Microsoft Excel, the listed features will not be available.

Minor loss of fidelity # of occurrences Version

Some cells or styles in this workbook contain formatting that is not supported by the selected file format. These formats will be converted to the closest format available. 1 Excel 97-2003
Vậy, nó là gì mà mình không hiểu
Nhờ google dịch xem nó là cái gì?
trên máy tôi Bà google dịch ra là:
Báo cáo tương thích cho timso.xls
Chạy vào ngày 5/11/2023 22:17
Nếu sổ làm việc được lưu ở định dạng tệp cũ hơn hoặc được mở ở phiên bản cũ hơn của Microsoft Excel, các tính năng được liệt kê sẽ không khả dụng.
Mất đi một chút độ trung thực Số lần xuất hiện Phiên bản.
Một số ô hoặc kiểu trong sổ làm việc này chứa định dạng không được hỗ trợ bởi định dạng tệp đã chọn. Các định dạng này sẽ được chuyển đổi sang định dạng gần nhất hiện có. 1 Excel 97-2003

File của bạn đang lưu ở dạng .xls.
Bạn thử xóa bỏ cái sheet mới tạo ra và lưu lại file với thành phần mở rộng là .xlsm. sau đó đóng file và mở lại xem có bí nữa không?
 
Upvote 0
Các bạn cho mình hỏi, minh bị sai trên đoạn code sau:
Sub ptb2()
Dim a, b, c As Integer
Dim D As Double
Dim x, x1, x2 As Variant
a = Cells(5, 4)
b = Cells(5, 5)
c = Cells(5, 6)
D = Cells(4, 7)
x1 = Cells(5, 8)
x2 = Cells(5, 9)
x = Cells(6, 9)
D = b * b - 4 * a * c
If a = 0 And b <> 0 Then
x1 = ""
x2 = ""
x = -c / b
Else
End If
If a <> 0 And b = 0 And c <= 0 Then
x1 = Sqr(c) (debug báo lỗi ở hàng này tô vàng)
x2 = -Sqr(c)
x = ""
Else
If D < 0 Then
x1 = "vo nghiem"
x2 = "vo nghiem"
End If
If D > 0 Then
x1 = (-b + Sqr(D)) / (2 * a)
x2 = (-b - Sqr(D)) / (2 * a)
End If
If D = 0 Then
x1 = -b / (2 * a)
x2 = -b / (2 * a)
End If
End If
Cells(5, 8) = x1
Cells(5, 9) = x2
Cells(6, 9) = x
Cells(4, 7) = D
End Sub

các bạn chỉ giùm điểm sai, cần phải sửa lại cú pháp như thế nào, cảm ơn trước....
 

File đính kèm

Upvote 0
Các bạn cho mình hỏi, minh bị sai trên đoạn code sau:
các bạn chỉ giùm điểm sai, cần phải sửa lại cú pháp như thế nào, cảm ơn trước....
Thử kiểm tra lại Ô F5 (Cells(5,6) ) là text hay số.
Nên bỏ các dòng
D = Cells(4, 7)
x1 = Cells(5, 8)
x2 = Cells(5, 9)
x = Cells(6, 9)
Và có thể tham khảo code sau (vẫn là code của bạn-tôi có sửa lại tý chút)

Mã:
Option Explicit

Sub ptb2()
Dim a, b, c As Integer
Dim D& ' As Double
Dim x, x1, x2 ' As Variant

On Error GoTo Loi

a = Cells(5, 4)
b = Cells(5, 5)
c = Cells(5, 6)

If a <> 0 And b = 0 And c <= 0 Then
    x1 = Sqr(--c) '(debug báo l?i ? hàng này tô vàng)
    x2 = -Sqr(--c)
    x = ""
    Exit Sub
ElseIf a = 0 And b <> 0 Then
    x1 = ""
    x2 = ""
    x = -c / b
    Exit Sub
Else

D = b * b - 4 * a * c

   If D < 0 Then
        x1 = "vo nghiem"
        x2 = "vo nghiem"
    End If
    If D > 0 Then
        x1 = (-b + Sqr(D)) / (2 * a)
        x2 = (-b - Sqr(D)) / (2 * a)
    End If
    If D = 0 Then
        x1 = -b / (2 * a)
        x2 = -b / (2 * a)
    End If
End If
Cells(5, 8) = x1
Cells(5, 9) = x2
Cells(6, 9) = x
Cells(4, 7) = D
MsgBox "Done"
Loi:
     If Err Then
        MsgBox "Đa có lôi say ra-Hay kiêm tra lai các thông sô"
     End If
End Sub
 
Upvote 0
Nhờ google dịch xem nó là cái gì?
trên máy tôi Bà google dịch ra là:
Báo cáo tương thích cho timso.xls
Chạy vào ngày 5/11/2023 22:17
Nếu sổ làm việc được lưu ở định dạng tệp cũ hơn hoặc được mở ở phiên bản cũ hơn của Microsoft Excel, các tính năng được liệt kê sẽ không khả dụng.
Mất đi một chút độ trung thực Số lần xuất hiện Phiên bản.
Một số ô hoặc kiểu trong sổ làm việc này chứa định dạng không được hỗ trợ bởi định dạng tệp đã chọn. Các định dạng này sẽ được chuyển đổi sang định dạng gần nhất hiện có. 1 Excel 97-2003

File của bạn đang lưu ở dạng .xls.
Bạn thử xóa bỏ cái sheet mới tạo ra và lưu lại file với thành phần mở rộng là .xlsm. sau đó đóng file và mở lại xem có bí nữa không?
Cám ơn bạn, đúng rồi, bởi mình dùng cả excel 2003 và excel 2016. Vì mình quen dùng giao diện 2003 nó đơn giản hơn thôi mà
Bài đã được tự động gộp:

Cám ơn bạn rất nhiều !!!

HUONGHCKT

bạn giỏi quá, nếu có thể, bạn có thể cho mình biết tên thật của bạn đươc không?
 
Lần chỉnh sửa cuối:
Upvote 0
bạn giỏi quá, nếu có thể, bạn có thể cho mình biết tên thật của bạn đươc không?
Khen giỏi quá là đủ điều kiện để yêu cầu người ta khai tên thật nhỉ!!!???
Thế bạn khai tên thật trước đi có được không?
 
Upvote 0
Cám ơn bạn, đúng rồi, bởi mình dùng cả excel 2003 và excel 2016. Vì mình quen dùng giao diện 2003 nó đơn giản hơn thôi mà
Bài đã được tự động gộp:

Cám ơn bạn rất nhiều !!!

HUONGHCKT

bạn giỏi quá, nếu có thể, bạn có thể cho mình biết tên thật của bạn đươc không?
Giờ có lẽ người dùng Excel 2003 rất ít, và không tương thích hoàn toàn với W10, W11, Off2016, Off2019,..Off365 (như bài trên là một minh chứng). Hai nữa là Ex2003 ít các hàm hơn (các Ex sau này có nhiều hàm và toàn là những hàm rất tiện ích Ví dụ hàm Xlookup, hàm dateIF, hamfMaxIf,...
Bạn muốn lấy tên thật của tôi để làm gì?
 
Upvote 0

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

Back
Top Bottom