Cần giúp đỡ về Code

Liên hệ QC

148btx

Thành viên mới
Tham gia
14/10/06
Bài viết
40
Được thích
103
Nghề nghiệp
Thiết kế điện
Trong bảng Sheet1 tôi có cột A ghi họ, cột B ghi tên. Nếu để nhập nhập Họ và tên lại trong cột C tôi ghi công thức như sau: =A1&" "&B1

Nếu làm như vậy cho cả bảng 65536 hàng cột thì File của tôi sẽ rất nặng, khoảng 4MB. Bạn nào có thể viết họ tôi Code trong VB để tiện lợi hơn và để File không lớn như vậy không ? Tức là trong cột C sẽ tự động có dự liệu của A và B cộng lại (lưu ý là phải có khoảng trống giữa Họ và tên trong cột C: Nguyễn Văn chứ không phải là NguyễnVăn)
 
Dear 148bxt,
------------
Đây là một bài tập VBA khá đơn giản. Có nhiều phương pháp để bạn làm điều này nhưng cách nào là nhanh mà hiệu quả nhất thì mới đáng bàn. Sau đây là cách của mình, không biết có tối ưu không:
Mã:
Private Sub CommandButton_Click()
[COLOR=darkgreen]'Thủ tục cho sự kiện Click của nút CommandButton
[/COLOR]Dim lngRowCount as Long
Dim rgFilldown [COLOR=darkgreen]' Vùng sẽ điền dữ liệu[/COLOR]
[COLOR=darkgreen]'Đếm số dòng sẽ điền dữ liệu, ví dụ dữ liệu của bạn bắt đầu [/COLOR]
[COLOR=darkgreen]'từ ô A1 và có thể kết thúc đến ô A65536:[/COLOR]
lngRowCount = WorksheetFunction.CountA(Range("A1:A65536"))
Set rgFilldown = Range("C1:C" & lngRowCount)
rgFilldown.Formula = "=$A1 & "" "" & $B1"
[COLOR=darkgreen]'Chuyển đổi về giá trị:[/COLOR]
rgFilldown.Copy
rgFilldown.PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Không biết code sau có nhanh hơn không?
(Bạn tham khảo thôi - Vì nếu vùng chứa họ tên của bạn có một hoặc nhiều dòng trống thì nó vẫn làm việc được đến dòng cuối cùng - Thực tế chỉ có 2 dòng lệnh).
Mã:
Public Sub Noi_Ho_Ten()
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Formula = _
"=A" & ActiveSheet.UsedRange.Row & "& " & "B" & ActiveSheet.UsedRange.Row
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Value = _
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Value
End Sub
 
Upvote 0
Cảm ơn Đào Việt Cường đã giúp đỡ. Tuy nhiên nếu làm như trên thì phải có một nút nhấn Button để ra lệnh nhập nối dữ liệu. Nếu không muốn có nút nhấn mà chương trình tự động nhập dữ liệu TEXT cột A và B vào C thì phải làm thế nào ?
 
Upvote 0
To SA_DQ:
Anh thử test đoạn code của tôi xem sao (cùng lấy 65536 dòng dữ liệu của cột A và B)
Tôi chỉ khai báo thêm 2 biến lấy thời gian
Mã:
Public Sub Noi_Ho_Ten()
Dim tg1, tg2
tg1 = Timer
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Formula = _
"=A" & ActiveSheet.UsedRange.Row & "& " & "B" & ActiveSheet.UsedRange.Row
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Value = _
Range("C" & ActiveSheet.UsedRange.Row & ":C" & ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1).Value
tg2 = Timer
Cells(1, 5) = tg2 - tg1
End Sub
Đây là code của anh:
Mã:
 Sub GhepHoTen()
 Dim StrC As String:             Dim Ij As Integer
 Dim KhDiem As Variant
 Sheets("DSach").Select:           Ij = 1
KhDiem = Timer()
 Do
     Ij = Ij + 1:        StrC = "B" & CStr(Ij)
     Range(StrC).Select:          If Len(Selection) < 1 Then Exit Do
     With Selection
           .Offset(0, 1).Value = .Offset(0, -1).Value & " " & .Value
     End With
 Loop
 Cells(2, 5) = Str(Timer() - KhDiem)
 'MsgBox Str(Timer() - KhDiem)
 End Sub
Còn với đoạn code của anh thì báo "tràn bộ đệm" do anh khai báo biến Ij là Integer, và nếu có khai báo là Long (hay...) thì tôi không đủ kiên nhẫn để đợi.
 
Lần chỉnh sửa cuối:
Upvote 0
148btx đã viết:
Nếu không muốn có nút nhấn mà chương trình tự động nhập dữ liệu TEXT cột A và B vào C thì phải làm thế nào?
Dear 148btx,
------------
Có thể bạn là người mới tiếp cận VBA? Không sao cả, hãy quan sát kỹ lưỡng các đối tượng trên Visual Basic Editer và tìm hiểu chúng. Kiến thức cơ bản trong website này cũng sẽ hỗ trợ bạn rất nhiều.
Sau khi bạn đã có một chút kiến thức căn bản về VBA, bạn hãy tìm hiểu về các thủ tục sự kiện của Workbook. Trong mỗi module Worksheet đều có chứa các thủ tục sự kiện cơ bản như:
Mã:
Option Explicit
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_Activate()
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_Calculate()
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_Deactivate()
 
End Sub
[COLOR=silver]______________________________________________________[/COLOR]
Private Sub Worksheet_Change(ByVal Target As Range)
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
 
End Sub
[COLOR=#c0c0c0]______________________________________________________[/COLOR]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 
End Sub
Bạn phải tìm hiểu kỹ về ý nghĩa các thủ tục này. Ở đây, phù hợp với yêu cầu của bạn, bạn nên chọn thủ tục sự kiện Worksheet_Activate(). Biến cố Activate của Worksheet xảy ra mỗi khi (nhấn mạnh) bạn lựa chọn Worksheet mà có chứa module thủ tục sự kiện này. Bạn cũng hiểu vì sao không nên chọn thủ tục Worksheet_Change, Worksheet_Calculate hay Worksheet_SelectionChange vì các sự kiện này xảy ra gần như thường xuyên (nhấn mạnh) trong quá trình bạn làm việc trên Worksheet đó - nếu không có kỹ thuật xử lý rất dễ bị lặp vô hạn các thủ tục các biến có này dẫn đến treo máy.
Chúc bạn... không bị treo máy!-\\/.
 
Upvote 0
Web KT
Back
Top Bottom