Mở rộng vùng tính

Liên hệ QC

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
703
Được thích
53
Giới tính
Nam
Chào các anh chị!
Em có đặt một Name cho vùng tính là VT(A4:E100), nhưng vì mải làm dữ liệu nó tràn ra vùng tính luôn, tức là qua A4:E101, thế là báo cáo bị sai, bị Sếp la,Mong các anh chị cho cách đặt vùng tình làm sao để dữ liệu tới đâu thì vùng tính tới đó, chứ em tính mở vùng tính tới 10000 luôn cho khỏi tràn.
 
Chào các anh chị!
Em có đặt một Name cho vùng tính là VT(A4:E100), nhưng vì mải làm dữ liệu nó tràn ra vùng tính luôn, tức là qua A4:E101, thế là báo cáo bị sai, bị Sếp la,Mong các anh chị cho cách đặt vùng tình làm sao để dữ liệu tới đâu thì vùng tính tới đó, chứ em tính mở vùng tính tới 10000 luôn cho khỏi tràn.

Tạo table , đặt tên vùng tính bằng tên của " Table"

ví dụ : vùng (A4:E100) là table1 , thì đặt tên table1 = VT(A4:E100) ,
 
Có cách không dùng Table không bạn, mình nhớ mang máng là hình như dùng Offset gì đó.
 
Name chỉ dùng khi dữ liệu đầu vào đã ổn định.

Khi dữ liệu còn có thể thêm bớt thì Table là hữu hiệu nhất để xác định một vùng tính.
 
Chào các anh chị!
Em có đặt một Name cho vùng tính là VT(A4:E100), nhưng vì mải làm dữ liệu nó tràn ra vùng tính luôn, tức là qua A4:E101, thế là báo cáo bị sai, bị Sếp la,Mong các anh chị cho cách đặt vùng tình làm sao để dữ liệu tới đâu thì vùng tính tới đó, chứ em tính mở vùng tính tới 10000 luôn cho khỏi tràn.
Cho biết hàm tính toán chứa ở dòng đầu tiên nằm ở cột nào?
Nếu dữ liệu nhiều cở vài chục ngàn dòng thì nên sử dụng VBA gán giá trị hàm xuống thì File sẽ đỡ ỳ ạch, có nghĩa là chỉ sử dụng hàm ở dòng đầu tiên còn lại các dòng bên dưới nó thì gán bằng giá trị (loại bỏ hàm).
Nếu dùng VBA thì không cần đặt Name.
 
Lần chỉnh sửa cuối:
Thôi chắc em dùng Table cho nó lành.
 
Chào các anh chị!
Em có đặt một Name cho vùng tính là VT(A4:E100), nhưng vì mải làm dữ liệu nó tràn ra vùng tính luôn, tức là qua A4:E101, thế là báo cáo bị sai, bị Sếp la,Mong các anh chị cho cách đặt vùng tình làm sao để dữ liệu tới đâu thì vùng tính tới đó, chứ em tính mở vùng tính tới 10000 luôn cho khỏi tràn.

Tôi cũng hay sử dụng Name trong câu lênh SQL, nên hay dùng cái hàm bên dưới để tạo Name động trong Excel.
Hàm này cũng chỉ cập nhật số dòng của name range thôi chứ không cho cột nhé. Tôi có ghi chú trong code.
Bạn tham khảo xem dùng được không. Mỗi khi có cập nhật dữ liệu thì gọi hàm createDynamicNamedRange() để cập nhật Name range.


Mã:
Function createDynamicNamedRange(sSheetName As String, sNameRange As String) As Boolean
'--------------------------------------------------------------------------------------
'# Áp dung cho mot Named Range da thiet lap truoc, hàm chi cap nhat dong cho so dòng cua range.
'# Dùng cho Named Range có dong tieu de va khong có dòng tieu de.
'# Khi gap NR 'không có' dòng tiêu de, khi thuc hien xóa toàn bo range (.ClearCntents): phai xet xem no có Empty không
'# de xác dinh dòng dau, dòng cuoi tao range dè len dòng tiêu de.
'--------------------------------------------------------------------------------------

    Dim sht As Worksheet
    Dim lngFirstRowRng As Long
    Dim lngLastRowRng As Long
    Dim lngFirstColRng As Long
    Dim lngLastColRng As Long
    Dim strColumnLetter As String
    Dim myDynamicNamedRange As Range

    Set sht = ThisWorkbook.Sheets(sSheetName)

    'Khai bao dòng/côt dau tiên cua Range
    lngFirstRowRng = sht.Range(sNameRange).Row
    lngFirstColRng = GetFirstColumn(sSheetName, sNameRange)
    strColumnLetter = ConvertToLetter(lngFirstColRng)
    With sht.Cells
        If WorksheetFunction.Count(Range(sNameRange)) = 0 Then      'neu range dang empty (khong có dong tieu de)
            lngLastRowRng = sht.Cells(Rows.Count, strColumnLetter).End(xlUp).Row + 1
            lngLastColRng = GetLastColumn(sSheetName, sNameRange)
        Else
            lngLastRowRng = sht.Cells(Rows.Count, strColumnLetter).End(xlUp).Row
            lngLastColRng = GetLastColumn(sSheetName, sNameRange)
        End If
        Set myDynamicNamedRange = .Range(.Cells(lngFirstRowRng, lngFirstColRng), .Cells(lngLastRowRng, lngLastColRng))
    End With

    ThisWorkbook.Names.Add Name:=sNameRange, RefersTo:=myDynamicNamedRange

End Function

'----------------------------------------------------------------
'# Hàm lay dong cuoi dua tren [Name Range]
'# Dung duoc trong truong hop dong dau cua Range khong phai tu 1
'----------------------------------------------------------------
Function GetLastRow(sSheetName As String, sNameRange As String) As Long
    Dim sht As Worksheet
    Dim FirstRow As Long
    Dim LastRow As Long

    Set sht = ThisWorkbook.Sheets(sSheetName)
    FirstRow = sht.Range(sNameRange).Row
    LastRow = sht.Range(sNameRange).Rows.Count + FirstRow - 1
    GetLastRow = LastRow
End Function

Function GetFirstColumn(sSheetName As String, sNameRange As String) As Long
    Dim sht As Worksheet
    Dim FirstCol As Long

    Set sht = ThisWorkbook.Sheets(sSheetName)
    FirstCol = sht.Range(sNameRange).Column
    GetFirstColumn = FirstCol
End Function

Function GetLastColumn(sSheetName As String, sNameRange As String) As Long
    Dim sht As Worksheet
    Dim LastCol As Long

    Set sht = ThisWorkbook.Sheets(sSheetName)
    LastCol = sht.Range(sNameRange).Columns(sht.Range(sNameRange).Columns.Count).Column
    GetLastColumn = LastCol
End Function

Function ConvertToLetter(iCol As Long) As String
'---------------------------------------------
'# Hàm chuyen so thu tu cot thanh ten Alphabe
'---------------------------------------------
    Dim iAlpha As Integer
    Dim iRemainder As Integer
    iAlpha = Int(iCol / 27)
    iRemainder = iCol - (iAlpha * 26)
    If iAlpha > 0 Then
        ConvertToLetter = Chr(iAlpha + 64)
    End If
    If iRemainder > 0 Then
        ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
    End If
End Function
 
Giả sử Sheet1 sử dụng hàm tại H4:M4 (không cần biết nó là hàm gì) thì tôi chơi kiểu vầy:
Mã:
Sub CopyFunction_GanXuong()
    Dim DongCuoi As Long
    Application.Calculation = xlManual
    With Sheet1
        DongCuoi = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range("H5:M" & DongCuoi).ClearContents
        .Range("H4:M4").Copy .Range("H4:M" & DongCuoi)
        .Range("H5:M" & DongCuoi).Value = .Range("H5:M" & DongCuoi).Value
    End With
    Application.Calculation = xlAutomatic
End Sub
 
Lần chỉnh sửa cuối:
Em không muốn dùng VBA (Topic này trong "Hàm và Công thức Excel")
 
Theo tôi:
- 10000 chỉ là cách phóng đại để chắc chắn 200% là dữ liệu không bao giờ vượt quá.

- thì cứ cho là 10000 đi. Có 10000 công thức thì mới sợ đơ máy chứ chỉ vài công thức thì 10000 dòng dữ liệu đâu có thể làm đơ máy? Người ta nói tới 10000 dòng dữ liệu chứ có chỗ nào nói 10000 công thức đâu nhỉ.

Nếu tôi hiểu được ý chủ thớt thì ...

Tôi không hâm mộ OFFSET như nhiều người, chỉ dùng khi hết cách. Vậy nếu có cột, vd. cột A, không bao giờ chứa ô trống thì
VT
Mã:
=Sheet1!$A$4:INDEX(Sheet1!$E$4:$E$10000;COUNTA(Sheet1!$A$4:$A$10000))
Giả thiết là VT luôn có ít nhất 1 dòng <> rỗng, vd. dòng 4 là tiêu đề.

Hay mình không hiểu được ý tác giả nhỉ.
 
  • Thích
Reactions: DMQ
Web KT
Back
Top Bottom