Lấy giá trị của cell đang merge! (2 người xem)

  • Thread starter Thread starter ThuNghi
  • Ngày gửi Ngày gửi
Liên hệ QC

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

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
Tôi có bảng tính như sau:
A1=2
A2=2
A3=2
A4=0
A5=0
A6=1
A7=1
- Cells A1; A2; A3
- Cells A4; A5
- Cells A6; A7
đang merge cell

Làm thế nào lấy giá trị của cell đang merge = VBA!
Cụ thể là Cells(4,1)=0...
Xin cám ơn.
 
Nhiều Cells đang merge thì chỉ cell trên cùng bên trái mới có giá trị, các cell khác rỗng. Trừ khi cố tình nghịch thôi.
 
Nhiều Cells đang merge thì chỉ cell trên cùng bên trái mới có giá trị, các cell khác rỗng. Trừ khi cố tình nghịch thôi.
Không nghịch đâu, vì
- Cells A1; A2; A3: merge
- Cells A4; A5: merge
- Cells A6; A7: merge
Gồm 3 phần merge. Vì view thì thấy
- Cells A1; A2; A3: X1
- Cells A4; A5: X2
- Cells A6; A7: X3
Nếu x>0 thì em có cách còn x=0 (X2) thì không thể lấy được giá trị A4, A5.
Em đang làm lấy DMHH từ BGIA theo link sau #58
http://www.giaiphapexcel.com/forum/showthread.php?39502-Hoàn-thiện-giúp-code-phiếu-hàng/page6
 
Lần chỉnh sửa cuối:
Thử nghiệm vầy nha:
- Merge A1, A2, A3
- Tại ô đã merge, gõ X
- tại B1, gõ =A1, rồi fill xuống.
 
Tôi có bảng tính như sau:
A1=2
A2=2
A3=2
A4=0
A5=0
A6=1
A7=1
- Cells A1; A2; A3
- Cells A4; A5
- Cells A6; A7
đang merge cell

Làm thế nào lấy giá trị của cell đang merge = VBA!
Cụ thể là Cells(4,1)=0...
Xin cám ơn.
Vậy có code nào mà chỉ ra từ A1:A7 có 3 phần merge.
Nhờ các anh chị HD.
K/g: Bác Sa
Em đã xem link trên nhưng chưa vận dụng được.
Xin cám ơn.
 

File đính kèm

"Nguyên con" đây, chưa sửa gì nhé! ThuNghi mang về có thể rút gọn được đấy
Mình làm lại cái code trên để lấy giá trị cột A thôi. NDU xem và chỉnh lại giúp nhé, thấy lộn xộn quá. Cám ơn.
PHP:
Option Explicit
Sub FindMergedCells()
Dim LastRow As Long, r As Long, s As Long
Dim MyAddr As String, MyTmp As String
Dim bien
With Sheets("TestPage")
  LastRow = .UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).Row
  'LastRow = .Cells(65000, 1).End(xlUp).Row'
End With
Sheets("TestPage").Select
s = 1
For r = 1 To LastRow
  Cells(r, 1).Select
  MyAddr = Selection.Address
  If InStr(MyAddr, ":") > 0 Then
    If MyTmp <> MyAddr Then bien = Cells(r, 1)
    Cells(s, 5) = MyAddr
    Cells(s, 6) = bien
    MyTmp = MyAddr
  Else
    Cells(s, 5) = MyAddr
    Cells(s, 6) = Cells(r, 1)
    MyTmp = ""
  End If
  s = s + 1
Next r
End Sub
 

File đính kèm

Thêm file

Mình làm lại cái code trên để lấy giá trị cột A thôi. NDU xem và chỉnh lại giúp nhé, thấy lộn xộn quá. Cám ơn.
PHP:
Option Explicit
Sub FindMergedCells()
Dim LastRow As Long, r As Long, s As Long
Dim MyAddr As String, MyTmp As String
Dim bien
With Sheets("TestPage")
  LastRow = .UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).Row
  'LastRow = .Cells(65000, 1).End(xlUp).Row'
End With
Sheets("TestPage").Select
s = 1
For r = 1 To LastRow
  Cells(r, 1).Select
  MyAddr = Selection.Address
  If InStr(MyAddr, ":") > 0 Then
    If MyTmp <> MyAddr Then bien = Cells(r, 1)
    Cells(s, 5) = MyAddr
    Cells(s, 6) = bien
    MyTmp = MyAddr
  Else
    Cells(s, 5) = MyAddr
    Cells(s, 6) = Cells(r, 1)
    MyTmp = ""
  End If
  s = s + 1
Next r
End Sub
Tôi thì làm vầy:
PHP:
Private Function FindMCell(SrcRng As Range)
  Dim Clls As Range, Tmp As String
  With CreateObject("Scripting.Dictionary")
    For Each Clls In SrcRng
      If Clls.MergeCells Then
        Tmp = Clls.MergeArea.Address
        If Not .Exists(Tmp) Then .Add Tmp, ""
      End If
    Next
    FindMCell = .Keys
  End With
End Function
PHP:
Sub Main()
  Dim Arr
  Arr = FindMCell(ActiveSheet.UsedRange)
  Range("E1").Resize(UBound(Arr) + 1) = WorksheetFunction.Transpose(Arr)
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi thì làm vầy:
PHP:
Private Function FindMCell(SrcRng As Range)
  Dim Clls As Range, Tmp As String
  With CreateObject("Scripting.Dictionary")
    For Each Clls In SrcRng
      If Clls.MergeCells Then
        Tmp = Clls.MergeArea.Address
        If Not .Exists(Tmp) Then .Add Tmp, ""
      End If
    Next
    FindMCell = .Keys
  End With
End Function
PHP:
Sub Main()
  Dim Arr
  Arr = FindMCell(ActiveSheet.UsedRange)
  Range("E1").Resize(UBound(Arr) + 1) = WorksheetFunction.Transpose(Arr)
End Sub
Cám ơn NDU nhiều.
Nhưng còn vần đề lấy giá trị của các cell thì tiếp là thế nào.
Và ví dụ có cell merge và có cell không. Mình chỉ lấy dữ liệu từ cột A thôi.
 
Cám ơn NDU nhiều.
Nhưng còn vần đề lấy giá trị của các cell thì tiếp là thế nào.
Và ví dụ có cell merge và có cell không. Mình chỉ lấy dữ liệu từ cột A thôi.
Thì sửa lại tí thôi mà:
PHP:
Private Function FindMCell(SrcRng As Range)
  Dim Clls As Range, Tmp As String, n As Long, Arr()
  With CreateObject("Scripting.Dictionary")
    For Each Clls In SrcRng
      If Clls.MergeCells Then
        Tmp = Clls.MergeArea.Address
        If Not .Exists(Tmp) Then
          n = n + 1
          .Add Tmp, ""
          ReDim Preserve Arr(1 To 2, 1 To n)
          Arr(1, n) = Tmp
          Arr(2, n) = Clls.Value
        End If
      End If
    Next
    FindMCell = WorksheetFunction.Transpose(Arr)
  End With
End Function
PHP:
Sub Main()
  Dim Arr
  With Sheet1
    Arr = FindMCell(.Range([A1], [A65536].End(xlUp)))
    .Range("E1:F1").Resize(UBound(Arr)) = Arr
  End With
End Sub
 

File đính kèm

Thì sửa lại tí thôi mà:
PHP:
Private Function FindMCell(SrcRng As Range)
  Dim Clls As Range, Tmp As String, n As Long, Arr()
  With CreateObject("Scripting.Dictionary")
    For Each Clls In SrcRng
      If Clls.MergeCells Then
        Tmp = Clls.MergeArea.Address
        If Not .Exists(Tmp) Then
          n = n + 1
          .Add Tmp, ""
          ReDim Preserve Arr(1 To 2, 1 To n)
          Arr(1, n) = Tmp
          Arr(2, n) = Clls.Value
        End If
      End If
    Next
    FindMCell = WorksheetFunction.Transpose(Arr)
  End With
End Function
PHP:
Sub Main()
  Dim Arr
  With Sheet1
    Arr = FindMCell(.Range([A1], [A65536].End(xlUp)))
    .Range("E1:F1").Resize(UBound(Arr)) = Arr
  End With
End Sub
Hay nhất bài này là
Tmp = Clls.MergeArea.Address
Nhờ có NDU mình làm OK rồi, cám ơn rất nhiều. Làm đơn giản thôi, dùng Dic có vẻ đao to quá vì mình chỉ cần tới đó.
PHP:
Sub GetMergedCells01()
Dim LastRow As Long, r As Long, MyTmp As String, MyAdd As String
Dim ArrKQ()
With Sheets("TestPage")
  LastRow = .UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
  .Columns("E:F").ClearContents
End With
ReDim ArrKQ(1 To LastRow, 1 To 2)
MyAdd = ""
With Sheets("TestPage")
  For r = 1 To LastRow
    If .Cells(r, 1).MergeCells Then
      MyTmp = .Cells(r, 1).MergeArea.Address
      If InStr(MyAdd, MyTmp) = False Then
        MyAdd = MyAdd & MyTmp
        ArrKQ(r, 2) = .Cells(r, 1)
       Else
        ArrKQ(r, 2) = ArrKQ(r - 1, 2)
      End If
    Else
      ArrKQ(r, 2) = .Cells(r, 1)
    End If
    ArrKQ(r, 1) = .Cells(r, 1).Address
  Next r
  .[E1].Resize(r - 1, 2) = ArrKQ
End With
Erase ArrKQ()
End Sub
Phải nói là Keys và Items trong Dic có nhiều ứng dụng.
 
Web KT

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

Back
Top Bottom