Nhờ giúp đỡ code gán công thức excel cho cột cố định

Liên hệ QC

tamhoncuada10313

Thành viên thường trực
Tham gia
7/4/08
Bài viết
221
Được thích
65
Em nhờ các bác giúp cho đoạn code làm việc như sau:em muốn gán công thức cho từng cột của sheet để người nhập chỉ việc nhập vào thôi, không cần phải kéo công thức.Cụ thể như sau: cột C gán công thức là: Vlookup(b3,DMhientai,2,0) . Cột D gán công thức là: Vlookup(b3,DVSD,4,0).
 
Các bác giúp cho đoạn code làm việc sau:em muốn gán công thức cho từng cột của sheet để người nhập chỉ việc nhập vào thôi, không cần phải kéo công thức.Cụ thể như sau: cột C gán công thức là: Vlookup(b3,DMhientai,2,0) . Cột D gán công thức là: Vlookup(b3,DVSD,4,0).

(*) Họ phải nhập vào đâu vậy bạn:
- Đầu các cột?, & nếu vậy thì mấy cột là vừa í bạn?
- Các dòng của cột 'B'?
- . . . . . (Khác)


Chúc vui!--=0 :-= --=0
 
Upvote 0
Em xin up file dữ liệu mẫu
 

File đính kèm

  • Book1.xls
    16 KB · Đọc: 241
Upvote 0
Em nhờ các bác giúp cho đoạn code làm việc như sau:em muốn gán công thức cho từng cột của sheet để người nhập chỉ việc nhập vào thôi, không cần phải kéo công thức.Cụ thể như sau: cột C gán công thức là: Vlookup(b3,DMhientai,2,0) . Cột D gán công thức là: Vlookup(b3,DVSD,4,0).
Dùng code này thử xem.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
    If Cll.Value = "" Then
        Range("C" & Cll.Row & ":D" & Cll.Row).ClearContents
    Else
        If Range("C" & Cll.Row).Formula = "" Then Range("C" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-1],DMhientai,2,0)"
        If Range("D" & Cll.Row).Formula = "" Then Range("D" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-2],DVSD,4,0)"
    End If
Next
Application.EnableEvents = True
End Sub
 
Upvote 0
Bạn sử dụng thêm hàm IF như file đính kèm nhé.
 

File đính kèm

  • Book1.xls
    18.5 KB · Đọc: 157
Upvote 0
Bác huuthang_BD ơi!em muốn đặt công thức từ dòng thứ 3 thì phải sửa như thế nào?RC[-1],RC[-2] là như thế nào?em muốn đặt công thức cho các cột không liền kề nhau thì sửa kiểu gì ở code của bác
 
Upvote 0
Bác huuthang_BD ơi!em muốn đặt công thức từ dòng thứ 3 thì phải sửa như thế nào?RC[-1],RC[-2] là như thế nào?em muốn đặt công thức cho các cột không liền kề nhau thì sửa kiểu gì ở code của bác
Nếu muốn đặt công thức từ dòng thứ 3 thì bạn sửa lại như thế này:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
If Cll.Row > 2 Then
    If Cll.Value = "" Then
        Range("C" & Cll.Row & ":D" & Cll.Row).ClearContents
    Else
        If Range("C" & Cll.Row).Formula = "" Then Range("C" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-1],DMhientai,2,0)"
        If Range("D" & Cll.Row).Formula = "" Then Range("D" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-2],DVSD,4,0)"
    End If
End If
Next
Application.EnableEvents = True
End Sub
RC[-1],RC[-2] là các tham chiếu được dùng trong công thức.
Nếu là địa chỉ tuyệt đối thì có dạng RxCy. RxCy là ô ở dòng x cột y (VD R2C6 là $F$2)
Nếu là địa chỉ tương đối thì có dạng R[x]C[y] (x, y có thể là số âm, dương hoặc 0). R[x]C[y] là ô cách ô công thức x dòng và y cột.

Trong trường hợp của bạn. Công thức ở cột C và tham chiếu đến giá trị cùng dòng ở cột B nên sẽ có dạng R[0]C[-1] (tham chiếu đến ô cách ô chứa công thức 0 dòng (cùng dòng) và -1 cột (cách cột C -1 cột là cột B). R[0]C[-1] có thể lượt bỏ thành RC[-1].

Muốn đặt công thức ở các cột không liền kề nhau thì bạn cứ dựa vào nguyên tắc này mà làm. Hoặc dùng Record Macro ghi lại.
 
Upvote 0
Em chuyển lệnh này:
IF(AND(A3>=BegDate;A3<=EndDate;IF(Flag=0;(RIGHT(B3;2)=MaKhuVuc);TRUE);IF(Flag1=0;(LEFT(D3;2)=Maphong);TRUE);IF(flag3=0;(LEFT(B3;2)=codedevice);TRUE));IF(ROW()=3;1;MAX($I$2:I2)+1);"")
thành như thế này:
If Range("I" & Cll.Row).Formula = "" Then Range("I" & Cll.Row).FormulaR1C1 = "=if(and(R[0]C[-7]>=BegDate,R[0]C[-7]<=EndDate,if(Flag=0,(right(RC[-7],2)=MaKhuVuc),true),if(Flag1=0,left(RC[-7],2)=Maphong),true),if(flag3=0,left(RC[-7],2)=codedevice),true)),if(ROW()=3,1,max(R1C1:R1C1)+1),"")"
nhưng không hiểu sao khi chạy thì nó lại điền công thức từ dòng thứ 4 chứ không phải thứ 3
Bác huuthang sửa giùm em với
Em muốn đặt điều kiện validation cho cột B luôn trong VBA thì làm thế nào ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em chuyển lệnh này:
IF(AND(A3>=BegDate;A3<=EndDate;IF(Flag=0;(RIGHT(B3;2)=MaKhuVuc);TRUE);IF(Flag1=0;(LEFT(D3;2)=Maphong);TRUE);IF(flag3=0;(LEFT(B3;2)=codedevice);TRUE));IF(ROW()=3;1;MAX($I$2:I2)+1);"")
thành như thế này:
If Range("I" & Cll.Row).Formula = "" Then Range("I" & Cll.Row).FormulaR1C1 = "=if(and(R[0]C[-7]>=BegDate,R[0]C[-7]<=EndDate,if(Flag=0,(right(RC[-7],2)=MaKhuVuc),true),if(Flag1=0,left(RC[-7],2)=Maphong),true),if(flag3=0,left(RC[-7],2)=codedevice),true)),if(ROW()=3,1,max(R1C1:R1C1)+1),"")"
nhưng không hiểu sao khi chạy thì nó lại điền công thức từ dòng thứ 4 chứ không phải thứ 3
Bác huuthang sửa giùm em với
Đoạn này không liên quan gì đến việc công thức điền vào dòng nào cả. Trong đoạn code ở bài trước có 1 dòng để đặt điều kiện cho dòng bắt đầu điền công thức:
PHP:
If Cll.Row > 2 Then
Bạn kiểm tra lại trong code của mình.
Lần sau bạn phải đưa toàn bộ code lên thì mới dễ tìm ra lỗi. Lỗi có thể xảy ra ở bất cứ chỗ nào trong code của bạn.

Em muốn đặt điều kiện validation cho cột B luôn trong VBA thì làm thế nào ạ
Cái này bạn hãy sử dụng chức năng Record Macro. Tôi nghĩ bạn làm được.
 
Upvote 0
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
If Cll.Row > 2 Then
If Cll.Value = "" Then
Range("A" & Cll.Row).NumberFormat = "dd/mm/yyyy"
Range("C" & Cll.Row & ":I" & Cll.Row).ClearContents
Else
If Range("C" & Cll.Row).Formula = "" Then Range("C" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-1],DMhientai,2,0)"
If Range("D" & Cll.Row).Formula = "" Then Range("D" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-2],DVSD,4,0)"
If Range("I" & Cll.Row).Formula = "" Then Range("I" & Cll.Row).FormulaR1C1 = "=if(and(R[0]C[-7]>=BegDate,R[0]C[-7]<=EndDate,if(Flag=0,(right(RC[-7],2)=MaKhuVuc),true),if(flag3=0,left(RC[-7],2)=codedevice),true)),if(ROW()=3,1,max(R[-1]C:R-1C) +1),"") "
End If
End If
Next
Application.EnableEvents = True
End Sub
Các bác em giùm em đoạn code trên sai ở đâu mà không chạy. Công thức cho cột I là: IF(AND(A3>=BegDate;A3<=EndDate;IF(Flag=0;(RIGHT(B3;2)=MaKhuVuc);TRUE);IF(flag3=0;(LEFT(B3;2)=codedevice);TRUE));IF(ROW()=3;1;MAX($I$2:I2)+1);"")
 
Upvote 0
Mình thấy đoạn code của bạn rất hay. Nhưng Mình muốn nhập vào nhiều cột chứ không phải một cột B:B như của bạn. Cụ thể ta có thẻ nhập vào cột A, B, C
VD: cột A ta nhập số 2, cột B nhập số 3, Cột C nhập số 4 cột E sẽ cho công thức =A*B*C, nói chung mình muốn nhập bất kỳ ô nào trong vùng từ cột A đến cột C thì đều gắn công thức vào. Code của bạn mình cố gắng sửa như không được nó chỉ nhân một cột cố định nào đó thôi. Xin ban giup đỡ

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
If Cll.Row > 2 Then
If Cll.Value = "" Then
Range("C" & Cll.Row & ":D" & Cll.Row).ClearContents
Else
If Range("C" & Cll.Row).Formula = "" Then Range("C" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-1],DMhientai,2,0)"
If Range("D" & Cll.Row).Formula = "" Then Range("D" & Cll.Row).FormulaR1C1 = "=VLOOKUP(RC[-2],DVSD,4,0)"
End If
End If
Next
Application.EnableEvents = True
End Sub

VD: cột A ta nhập số 2, cột B nhập số 3, Cột C nhập số 4 cột E sẽ cho công thức =A*B*C, nói chung mình muốn nhập bất kỳ ô nào trong vùng từ cột A đến cột C thì đều gắn công thức vào. Code của bạn mình cố gắng sửa như không được nó chỉ nhân một cột cố định nào đó thôi. Xin ban giup đỡ

a anh ta nhập vào cột B, nhưng e muốn nhập vào nhiều cột thì làm thế nào ví dụ cột A, B, C. Nếu ta nhập vào những con số để tự gắn công thức và tính thành tích đó mà.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn thử với macro sau & cho biết những gì chưa vừa í, nha

Mình thấy đoạn code của bạn rất hay. Nhưng Mình muốn nhập vào nhiều cột chứ không phải một cột B:B như của bạn. Cụ thể ta có thẻ nhập vào cột A, B, C
VD: cột A ta nhập số 2, cột B nhập số 3, Cột C nhập số 4 cột E sẽ cho công thức =A*B*C, nói chung mình muốn nhập bất kỳ ô nào trong vùng từ cột A đến cột C thì đều gắn công thức vào. Code của bạn mình cố gắng sửa như không được nó chỉ nhân một cột cố định nào đó thôi. Xin ban giup đỡ

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("A2:C999")) Is Nothing Then
   Cells(Target.Row, "D").FormulaR1C1 = "=RC[-3]*RC[-2]*RC[-1]"
 End If
End Sub

Nếu bạn muốn nới thêm dòng vùng nhập thì sửa lại cho thích hợp.
 
Upvote 0
Mình cảm ơn bạn nhiều nhé. đoạn code của bạn đúng ý mình rồi. Nhưng sao nó chỉ chạy độc lập, chứ khi mình gắn chung vào code của mình thì nó không chạy được vậy bạn. Bạn giup mình nhé. Mình muốn gắn đoạn code của bạn với đoạn code của mình vào chung.
Code của bạn mình sửa lại thế này.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E2:H999")) Is Nothing Then
Cells(Target.Row, "I").FormulaR1C1 = "=round(PRODUCT(RC[-4]:RC[-1]),4)"
End If
End Sub
Code của mình đây
Private Sub Worksheet_Change(ByVal Target As Range)
'Created by Ngo Tuan Anh
If Target.Cells.Count > 1 Then Exit Sub
'Dieu kien tong quat (1)
If Target.Column = 2 And Target.Row > 6 Then
Application.EnableEvents = False
'Them dau "." :
If Len(Target) = 7 Then Target = Left(Target, 2) & "." & Right(Target, 5)
'Chuyen chu HOA :
Target = UCase(Target)
Application.EnableEvents = True
'1. Voi phan tra MHCV:
'Dim Sh As Worksheet, Rng As Range, sRng As Range
'Set Sh = Worksheets("DonGia")
'Set Rng = Sh.Range(Sh.[a19], Sh.[A10000].End(xlUp))
Dim Wb As Workbook, Sh As Worksheet, Rng As Range, sRng As Range
Set Wb = Workbooks("DuToan-Excel.xls")
Set Sh = Wb.Sheets("DonGia")
Set Rng = Sh.Range(Sh.[A19], Sh.[A10000].End(xlUp))
Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
If Target = "TT" Then Target.Font.ColorIndex = 3
If Target <> "" And sRng Is Nothing Then
Target.Font.ColorIndex = 3
MsgBox "- Ma hieu don gia nay chua duoc cap nhat trong bang 'Don Gia'." + Chr(13) + "- Hay su dung MHDG cua 1 cong viec tuong tu hoac MHDG tam tinh <TT>." + Chr(13) + "- Truong hop muon ghi STT thi xin dung ghi vao cot nay, ghi chung vao cot ''Noi dung cong viec'' !", vbInformation, "Chu y:"
'GoTo KeKhung
Else
With Target
.Offset(0, -1) = "=COUNT(R6C:R[-1]C)+1"
.Offset(0, 1) = sRng.Offset(, 1).Value
.Offset(0, 2) = sRng.Offset(, 2).Value
.Offset(0, 9) = sRng.Offset(, 3).Value
.Offset(0, 10) = sRng.Offset(, 4).Value
.Offset(0, 11) = sRng.Offset(, 5).Value
.Offset(0, 12) = "=ROUND(RC[-9]*RC[-3],0)"
.Offset(0, 13) = "=ROUND(RC[-10]*RC[-3],0)"
.Offset(0, 14) = "=ROUND(RC[-11]*RC[-3],0)"
Application.EnableEvents = True
End With
End If
GoTo KeKhung
End If
'Het dieu kien tong quat (1)
'2. Voi phan tinh toan khoi luong:
'If Not Intersect(Target, Range("C7:C55555")) Is Nothing Then
If Target.Row < 7 Or Target.Column <> 3 Then Exit Sub
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then Exit Sub
'--------------------------------------------------------
If InStr(Target, "=") = False Then Exit Sub
If InStr(Target, ": ") Then
'Ta = Right(Target, Len(Target) - InStr(Target, ":") - 1)
Ta = Mid(Target, InStr(Target, ":") + 1, InStr(Target, "=") - InStr(Target, ":") - 1) ' <-- sua
Tb = Replace(Ta, " ", "")
KoCoDienGiai:
On Error GoTo LOI
Tc = Replace(Tb, ",", ".")
Tc = Replace(Tc, "x", "*")
Tc = Replace(Tc, "=", "")
Khoiluong = Round(Evaluate("=" & Tc), 3)
'Noi gia tri voi ket qua:
If Right(Target, 1) = "=" Or Khoiluong <> Replace(Right(Target, Len(Target) - InStr(Target, "=")), " ", "") Then ' <-- them
With Target
'.Value = .Value & " " & Khoiluong
.Value = Left(.Value, InStr(.Value, "=")) & " " & Khoiluong
.Font.ColorIndex = 9
.Characters(InStr(.Value, "=") + 1, Len(.Value)).Font.ColorIndex = 5
End With
Else: '<-- them
With Target
.Font.ColorIndex = 9
.Characters(InStr(.Value, "=") + 1, Len(.Value)).Font.ColorIndex = 5
End With
Exit Sub '<-- them
End If
Else:
Tb = Replace(Target, " ", "")
If IsNumeric(Left(Tb, 1)) Or Left(Tb, 1) = "(" Then
Tb = Left(Target, InStr(Target, "=") - 1) ' <-- them
GoTo KoCoDienGiai
Else: Exit Sub
End If
End If
'Sum Khoi Luong:
If WorksheetFunction.CountA(Range("B7:B55555")) = 0 Then Exit Sub
Set MHCV = Target.Offset(0, -1).End(xlUp)
m = Target.Offset(0, -1).End(xlUp).Row
'Neu la cong viec dau tien hoac cuoi cung:
If WorksheetFunction.CountA(Range("B" & Target.Row & ":B55555")) = 0 Then
n = [C55555].End(xlUp).Row
iR = m - n
Else:
'Neu la cac cong viec o giua:
n = Target.Offset(0, -1).End(xlDown).Row
iR = m - n + 1
End If
MHCV.Offset(0, 8) = "=SUM(R[0]C[-1]:R[" & -iR & "]C[-1])"
'End If
'-----------------------------
'Sum Chi tiet:
If WorksheetFunction.CountA(Range("B7:B55555")) = 0 Then Exit Sub
Set MHCV = Target.Offset(0, -1).End(xlUp)
m = Target.Offset(0, -1).End(xlUp).Row
'Neu la cong viec dau tien hoac cuoi cung:
If WorksheetFunction.CountA(Range("B" & Target.Row & ":B55555")) = 0 Then
n = [C55555].End(xlUp).Row
iR = m - n
Else:
'Neu la cac cong viec o giua:
n = Target.Offset(0, -1).End(xlDown).Row
iR = m - n + 3
End If
MHCV.Offset(0, 7) = "=PRODUCT(R[0]C[-4]:R[" & -iR & "]C[-1])"
'End If
'-----------------------------
KeKhung:
If [A55555].End(xlUp) <> "." Then
Dim R As Range
iR = [C55555].End(xlUp).Row
Set R = Range("A7:p" & iR)
With R.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With R.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
With R.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
End With
With R.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
End With
On Error Resume Next 'Neu dang tren bang DonGia hoac vung chon = 1 dong
With R.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlHairline
End With
Target.Offset(1).Select
End If
Exit Sub
'---------------------------------------
LOI:
Target.Characters(InStr(Target, ":") + 1, Len(Target)).Font.ColorIndex = 3
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
If Target.Column = 3 Then
Cancel = True
Application.Run "'DuToan-Excel.xls'!CallForm"
End If
End Sub
Nhờ bạn giúp mình ghép 2 đoạn đó vào một mà vẫn hoạt động bình thường. cám ơn bạn nhiều
 
Upvote 0
Chưa rõ hết í đồ của bạn, nhưng có 1 số í ban đầu như sau:

'Code cua ban mình sua lai thé này.'
PHP:
Option Explicit            '<=|'
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E2:H999")) Is Nothing Then
Cells(Target.Row, "I").FormulaR1C1 = "=round(PRODUCT(RC[-4]:RC[-1]),4)"
End If
End Sub

'Code cua mình Dây:'
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
'Created by Ngo Tuan Anh'
Dim Ta As String, tB As String, tC As String, KhoiLuong  '<=|(A)'
Dim MHCV As Range, M As Long, N As Long, Ir As Long      '<=|(A)'
Const XH As String = Chr(13)

 If Target.Cells.Count > 1 Then Exit Sub     '<=|'
1 'Dieu kien tong quat (1)'
 If Target.Column = 2 And Target.Row > 6 Then    '<=|(B)'
   Application.EnableEvents = False
   'Them dau "." :'
   If Len(Target) = 7 Then Target = Left(Target, 2) & "." & Right(Target, 5)
   'Chuyen chu HOA :'
   Target = UCase(Target)
   Application.EnableEvents = True
   '1. Voi phan tra MHCV:'
   'Dim Sh As Worksheet, Rng As Range, sRng As Range'
   'Set Sh = Worksheets("DonGia")'
   'Set Rng = Sh.Range(Sh.[a19], Sh.[A10000].End(xlUp))'
   Dim Wb As Workbook, Sh As Worksheet, Rng As Range, sRng As Range
   Set Wb = Workbooks("DuToan-Excel.xls")
   Set Sh = Wb.Sheets("DonGia")
   Set Rng = Sh.Range(Sh.[A19], Sh.[A10000].End(xlUp))
   Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
10   If Target = "TT" Then Target.Font.ColorIndex = 3
11   If Target <> "" And sRng Is Nothing Then
      Target.Font.ColorIndex = 3
      MsgBox "- Ma hieu don gia nay chua duoc cap nhat trong bang 'Don Gia'." & XH & _
         "- Hay su dung MHDG cua 1 cong viec tuong tu hoac MHDG tam tinh <TT>." & XH & _
         "- Truong hop muon ghi STT thi xin dung ghi vao cot nay, ghi chung vao cot ''Noi dung cong viec'' !", vbInformation, "Chu y:"
'GoTo KeKhung'
   Else
      With Target
         .Offset(0, -1) = "=COUNT(R6C:R[-1]C)+1"
         .Offset(0, 1) = sRng.Offset(, 1).Value
         .Offset(0, 2) = sRng.Offset(, 2).Value
         .Offset(0, 9) = sRng.Offset(, 3).Value
         .Offset(0, 10) = sRng.Offset(, 4).Value
         .Offset(0, 11) = sRng.Offset(, 5).Value
         .Offset(0, 12) = "=ROUND(RC[-9]*RC[-3],0)"
         .Offset(0, 13) = "=ROUND(RC[-10]*RC[-3],0)"
         .Offset(0, 14) = "=ROUND(RC[-11]*RC[-3],0)"
         Application.EnableEvents = True
      End With
   End If
   GoTo KeKhung
 End If
'Het dieu kien tong quat (1)'
2 '. Voi phan tinh toan khoi luong:'
'If Not Intersect(Target, Range("C7:C55555")) Is Nothing Then'
20 If Target.Row < 7 Or Target.Column <> 3 Then Exit Sub    '<=|(C)'
If Target.Offset(0, -1) <> "" Then Exit Sub
If Target = "" Then Exit Sub
'--------------------------------------------------------'
If InStr(Target, "=") = False Then Exit Sub
If InStr(Target, ": ") Then
'Ta = Right(Target, Len(Target) - InStr(Target, ":") - 1)'
   Ta = Mid(Target, InStr(Target, ":") + 1, InStr(Target, "=") - InStr(Target, ":") - 1) ' <-- sua'
   tB = Replace(Ta, " ", "")
KoCoDienGiai:
   On Error GoTo LOI
   tC = Replace(tB, ",", ".")
   tC = Replace(tC, "x", "*")
   tC = Replace(tC, "=", "")
   KhoiLuong = Round(Evaluate("=" & tC), 3)
   'Noi gia tri voi ket qua:'
   If Right(Target, 1) = "=" Or KhoiLuong <> Replace(Right(Target, Len(Target) - InStr(Target, "=")), " ", "") Then ' <-- them
      With Target
         '.Value = .Value & " " & Khoiluong'
         .Value = Left(.Value, InStr(.Value, "=")) & " " & KhoiLuong
         .Font.ColorIndex = 9
         .Characters(InStr(.Value, "=") + 1, Len(.Value)).Font.ColorIndex = 5
      End With
   Else: '<-- them'
      With Target
         .Font.ColorIndex = 9
         .Characters(InStr(.Value, "=") + 1, Len(.Value)).Font.ColorIndex = 5
      End With
      Exit Sub '<-- them'
   End If
 Else
   tB = Replace(Target, " ", "")
   If IsNumeric(Left(tB, 1)) Or Left(tB, 1) = "(" Then
      tB = Left(Target, InStr(Target, "=") - 1) ' <-- them'
      GoTo KoCoDienGiai
   Else:             Exit Sub
   End If
 End If
'Sum Khoi Luong:'
 If WorksheetFunction.CountA(Range("B7:B55555")) = 0 Then Exit Sub
 Set MHCV = Target.Offset(0, -1).End(xlUp)
 M = Target.Offset(0, -1).End(xlUp).Row
 'Neu la cong viec dau tien hoac cuoi cung:'
 If WorksheetFunction.CountA(Range("B" & Target.Row & ":B55555")) = 0 Then
   N = [C55555].End(xlUp).Row
   Ir = M - N
 Else:
   'Neu la cac cong viec o giua:'
   N = Target.Offset(0, -1).End(xlDown).Row
   Ir = M - N + 1
 End If
MHCV.Offset(0, 8) = "=SUM(R[0]C[-1]:R[" & -Ir & "]C[-1])"
'End If'
'-----------------------------'
'Sum Chi tiet:'
If WorksheetFunction.CountA(Range("B7:B55555")) = 0 Then Exit Sub
 Set MHCV = Target.Offset(0, -1).End(xlUp)
 M = Target.Offset(0, -1).End(xlUp).Row
'Neu la cong viec dau tien hoac cuoi cung:
 If WorksheetFunction.CountA(Range("B" & Target.Row & ":B55555")) = 0 Then
   N = [C55555].End(xlUp).Row
   Ir = M - N
 Else:
   'Neu la cac cong viec o giua:'
   N = Target.Offset(0, -1).End(xlDown).Row
   Ir = M - N + 3
 End If
 MHCV.Offset(0, 7) = "=PRODUCT(R[0]C[-4]:R[" & -Ir & "]C[-1])"
'End If'
'-----------------------------'
KeKhung:
If [A55555].End(xlUp) <> "." Then
   Dim R As Range
   Ir = [C55555].End(xlUp).Row
   Set R = Range("A7:p" & Ir)
   With R.Borders(xlEdgeLeft)
      .LineStyle = xlContinuous
      .Weight = xlThin
   End With
   With R.Borders(xlEdgeBottom)
      .LineStyle = xlContinuous
      .Weight = xlHairline
   End With
   With R.Borders(xlEdgeRight)
      .LineStyle = xlContinuous
      .Weight = xlThin
   End With
   With R.Borders(xlInsideVertical)
      .LineStyle = xlContinuous
      .Weight = xlThin
   End With
   On Error Resume Next 'Neu dang tren bang DonGia hoac vung chon = 1 dong'
   With R.Borders(xlInsideHorizontal)
      .LineStyle = xlContinuous
      .Weight = xlHairline
   End With
   Target.Offset(1).Select
 End If
 Exit Sub
'---------------------------------------
LOI:
Target.Characters(InStr(Target, ":") + 1, Len(Target)).Font.ColorIndex = 3
End Sub

PHP:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
On Error Resume Next
If Target.Column = 3 Then
   Cancel = True
   Application.Run "'DuToan-Excel.xls'!CallForm"
End If
End Sub

(*) Khi đã dùng câu Option Explicit thì các biến fải được khai báo tường minh

(*) Sự kiện WorkSheet_Change chỉ là 1 macro mà thôi;
Cách nhốt chúng chung sẽ như sau:

PHP:
Option Explicit            '<=|'
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("E2:H999")) Is Nothing Then
     Cells(Target.Row, "I").FormulaR1C1 = "=round(PRODUCT(RC[-4]:RC[-1]),4)"
 ElseIf Not Intersect(Target, Range("B7:B9999")) Is Nothing then
    . . . . .   (Các Lệnh của Đ/K 1)
 
 ElseIf Not Intersect(Target, Range("C2:C99")) Is Nothing then
   . . . . . . . . .  Các Lệnh Đ/K 2)
End If
End Sub

Các câu lệnh điều kiện thoát cần xem lại cho thích hợp.

Vài ý cùng bạn. Cũng sẵn lòng giúp bạn toàn bộ macro; Nhưng cần biết rõ hơn í đồ của bạn là gì?

Chúc vui!
 
Upvote 0
Cung là ý điền công thức nhưng là công thức dò tìm giá trị của một sheet khác bằng "=INDEX(HDTDE,MATCH(RC[-7],COTTENCTTD,0),20)" nhưng minh muốn số 20 là 1 gia trị vẫn lấy được khi cột bên sheets cần lấy bị thay đổi, do đó mình đã đặt tên cột và xác định vị trí cột, nhưng không biết đưa vào kiểu gì, mong các anh chỉ giáo đây là biến gán lấy số cột SO1 = Val(HDTVLAPE.Range("SO_BCKTKT_0").Column) công thức khi chạy lại chèn hiện =INDEX(HDTVLAPE;MATCH(C30;COTTENCT;0);'SO1')
 
Upvote 0
Web KT

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

Back
Top Bottom