Đặt tên Name

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tham khảo Code của Anh SA_DQ về tìm LastCell

PHP:
'Find the last used Cell on a Worksheet:'
Sub FindLastCell()
Dim LastColumn As Integer
Dim LastRow As Long
Dim LastCell As Range
Dim LastCell1 As String
    If WorksheetFunction.CountA(Cells) > 0 Then
        'Search for any entry, by searching backwards by Rows.'
        LastRow = Cells.Find(What:="*", After:=[A1], _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious).Row
        'Search for any entry, by searching backwards by Columns.'
                LastColumn = Cells.Find(What:="*", After:=[A1], _
                    SearchOrder:=xlByColumns, _
                    SearchDirection:=xlPrevious).Column
                Cells(LastRow, LastColumn).Select
                'MsgBox Cells(LastRow, LastColumn).Address'
                LastCell1 = Cells(LastRow, LastColumn).Address
                'MsgBox (LastCell1)'
                Range("A1:" & LastCell1).Select
                'ActiveWorkbook.Names.Add Name:="MyRange", RefersToR1C1:="=Data!A1:E11"
    End If
End Sub
Nhờ các bạn chỉ hộ cách đặt tên vùng selected là MyRange
Xin cám ơn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn thử xem!
Mã:
.....
ActiveWorkbook.Names.Add Name:="MyRange", RefersToR1C1:=Selection


From ThuNghi:
OK làm được rồi, cám ơn nhiều lắm!
Nếu MyRange đã có, xin cho thêm thông báo và cho phép thay bằng tên khác.

Bạn thử đoạn code sau:
Mã:
Option Explicit
Public Sub Creat_Name()
On Error Resume Next
Dim i As Long
Dim tontai As Boolean
Dim strName As String
strName = "MyRange"
If Ktra(strName) Then
    Do
        strName = InputBox("Da ton tai ten " & strName & Chr(10) & "De nghi nhap ten khac!")
    Loop While Ktra(strName)
    ActiveWorkbook.Names.Add Name:=strName, RefersToR1C1:=Selection
Else
    ActiveWorkbook.Names.Add Name:="MyRange", RefersToR1C1:=Selection
End If
End Sub
Public Function Ktra(strName As String) As Boolean
Dim i As Long
Ktra = False
For i = 1 To ActiveWorkbook.Names.Count
    If ActiveWorkbook.Names(i, 1, 1).NameLocal = strName Then
        Ktra = True
        Exit For
    End If
Next i
End Function
 
Upvote 0
Cám ơn rất nhiều. Xin hỏi thêm
1/ Sheet("nhaplieu").select vd (i=1; j=1)
With sheet("nhatky")
.cells(i,j).value = cells(i,2).value

thì có nhanh hơn
.range("a1").value=range("B1").value

2/ Ta dùng sub link paste name để tạo bảng liệt kê các name trong file
vd: a1: tên name: SoCt; B1: vùng là nhatky!A1:A100
.....
A15...
Vậy nếu ta muốn thay đốỉ name SoCt là A1:A500
Và name15 là X1:X500
Có thể dùng VBA không hay là phải gia công

3/Sub DINHDANG()
'phan dinh dang
Application.ScreenUpdating = False
Dim maxstt, sott As Integer
Dim SPhieu As Range

Sheets("NHATKY").Select
hangbatdau = Cells(2, 1).Value+2
sott = Cells(hangbatdau, 1).Value
maxstt = "=COUNTIF(SPhieu,Sott)"
maxstt = worksheetFunction.Countif(SPhieu,Sott)

Range("a2:u2").Copy
Range("a0" & hangbatdau - maxstt & ":U0" & hangbatdau).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Application.ScreenUpdating = -1
End Sub
Xin hỏi phần chữ đỏ là sai thế nào mà nó không chạy.
Xin cám ơn nhiều!
 
Upvote 0
1. Theo tôi thì tốc độ xử lý của 2 lệnh:
.cells(i,1).value = cells(i,2).value

.range("a1").value=range("B1").value
là như nhau. (???)
2. Mình chưa hiểu ý bạn hỏi??
3.
maxstt = "=COUNTIF(SPhieu,Sott)"
nếu bạn viết như vậy thì biến maxstt sẽ nhận giá trị là một string (chứ không phải là công thức). Nếu bạn muốn viết như vế phải thì vế trái của lệnh trên phải là một ô có thuộc tính là FormulaR1C1
Ví dụ:
ActiveCell.FormulaR1C1 = "=COUNTIF(SPhieu,Sott)"
và dĩ nhiên bạn phải xác định vùng và giá trị cho SPhieu, Sott (Insert/Name/ Define)
maxstt = worksheetFunction.Countif(SPhieu,Sott)
Về cú pháp lệnh trên hoàn toàn đúng, nhưng trong Sub DINHDANG bạn chưa gán giá trị cho biến SPhieu.
P/S: Bạn khai báo Dim maxstt, sott As Integer thì VB và VBA chỉ hiểu biến sott có kiểu Integer, còn biến maxstt có kiểu Variant. Sau mỗi tên biến phải là từ khoá As Kieudulieu
 
Upvote 0
Cám ơn nhiều
2/ Theo file kèm, ví dụ ta đặt Myrange=A1:A30
Nay ta thay Myrange=A1:A1000
Bạn sửa hộ trong file
3/ Đã chọn Sphieu là một name trong file : Sh Data A1:A1000 rồi
vậy phải khai báo như thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
2. Thực ra trong file của bạn chỉ có 3 Name nên bạn hoàn toàn có thể thay thế bằng tay được. Nhưng nếu nhiều tên cần thay thế thì bạn sử dụng Macro sau:
Mã:
Public Sub ThayThe()
Dim i, StrText
For i = 1 To ActiveWorkbook.Names.Count
    StrText = Replace(ActiveWorkbook.Names(i, 1, 1).RefersTo, 30, 1000)
    ActiveWorkbook.Names.Add Name:=ActiveWorkbook.Names(i, 1, 1).NameLocal, _
          RefersTo:=StrText
Next i
End Sub
3. Nếu bạn đã đặt tên có Name là SPhieu, RefersTo là Data!$A$2:$A$1000 thì bạn sử dụng cú pháp sau:
Mã:
[B][COLOR=#ff0000]maxstt = worksheetFunction.Countif([COLOR=magenta]Range("SPhieu")[/COLOR],Sott)[/COLOR][/B]

From ThuNghi:
Cám ơn nhiều, mấy cái vụ VBA này mình không có căn bản, học từ nóc nên chậm hiểu.
Bạn làm một file hộ, nhiều lúc ta không phải thay thế hết, mà chỉ 1 vài name theo liệt kê: tên, vùng cũ, vùng thay thế. Bạn làm 1 sub tìm và thay thế theo sh liệt kê. Cám ơn.
Vậy thì bạn sử dụng file sau:
(Chạy Macro ThayThe nhé)
 

File đính kèm

  • ThayVungName.xls
    26 KB · Đọc: 50
Upvote 0
Cám ơn!
Còn một vấn đề là name thay thế hiển thị như sau:"Data!$C$2:$C$5"
Phải vào define bỏ dấu " mới được.
Với lại không cần thiết name cũ tham chiếu ở đâu mà chỉ cần với name mới sẽ thay thế là, vd: Manv = Data!$C$2:$C$125.
 
Upvote 0
eem thực hiện đoạn mã sau để di chuyển từ một sheet khác đến sheet"main"nhưng bị báo lỗi :run-time error '1004'

Sub main()
Application.Goto Reference:="main"
End Sub


Các bác chỉ giúp em sai ở đâu ??Cám ơn các bác!

em đang tập tành đó muh:-=

Code như vậy thì ko đúng, nếu trong cùng worksbook thì bạn dùng code này là được:

Mã:
Sheets("main").select

Thế là ổn.

em ngồi nán lại cty cũng mong được giúp đỡ.Mỗi lần mình làm thành công theo ý mình thích thật. Cám ơn anh một lần nữa.Cái code em post lên là em tham khảo được, nhưng em áp dụng cho file của mình thì lại không được. Trong khi file của họ lại chạy ro ro.Cám ơn anh

Chào NEO, PhanTuHuong,
Thực sự ra đoạn code của bạn
Mã:
Application.Goto Reference:="main"
Nó tương đương với việc bạn nhấn tổ hợp phím Ctrl + G và chọn main, xong nhấn OK.
Tại sao như vậy, bạn NEO sẽ bị lầm tưởngsheet main chứ thật sự ra ở sheet main có một ô nào đó được đặt tên là main.
Bạn hãy thử tạo một workbook mới, sau đó đặt tên một sheet là main, chọn ô Á và Ctrl + F3 và đặt tên là main. Sau đó bạn ghi macro và nhấn tổ hợp phím Ctrl + G chọn main và OK. Sau đó Alt + F11 và xem đoạn mã vừa mới ghi xem sao?

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

Lê Văn Duyệt

%$$ Wow!%$$ Lại được anh Duyệt ra tay giải đápHết bên box kế toán rồi lại box Excel này.Chân thành cám ơn sự giúp đỡ nhiệt tình của Anh dành cho kẻ tập tành này. Quả đúng như vậy Anh Duyệt, có đôi khi em nhấn F5 or Alt+F8 để thử nghiệm thì nó chạy thẳng vào cửa số mình đang soạn thảo đoạn mã đó, như Anh nói, vì nó có chứa chữ "main"Giờ Anh nói như vậy thì em mới hiểu.
Chúc anh khoẻ!


Cũng ở file ThaytheName.xls (Vì file đó mình đã tạo thêm 3 Name là: rngname, rngFind và rngReplace) bạn thêm code sau:
Mã:
Public Sub Add_name()
Dim i As Long
For i = 1 To Range("rngName").Rows.Count
    ActiveWorkbook.Names.Add Name:=Range("rngName").Cells(i, 1).Value, _
           RefersTo:="=" & Range("rngReplace").Cells(i, 1).Value
Next i
End Sub

From ThuNghi:
Rất cám ơn! File rất là cần thiết.
 
Upvote 0
Web KT
Back
Top Bottom