微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA 脚本字典数字字段

如何解决VBA 脚本字典数字字段

首先,过去一年我一直在使用 VBA 来实现一些效率,但我对 VBA 仍然很陌生,因此我的脚本绝对没有我希望的那么干净。

我的问题: 我创建了一个表格,可以在其中包含/排除较大数据集中的不同值。这个表是用脚本字典制作的。数据集可以包含数值作为参数,应将其视为文本值。示例:“05”和“5”应被视为两个不同的值。脚本字典将这两个值保存为两个不同的值,但是当我对键使用 Application.Transpose 代码时,这些键被视为一个值(“5”)。 有没有办法将键粘贴为两个不同的值?我尝试在相关数据前添加一个“'”,但这没有出现在键中。

代码

Dim d As Object,c As Variant,j As Long,lr As Long
Set d = CreateObject("Scripting.Dictionary")
Worksheets("DATASET").Activate
lr = Cells(Rows.Count,aCell.Column).End(xlUp).Row
c = Range(Cells(1,aCell.Column).Address(),Cells(lr,aCell.Column).Address())
For j = 1 To UBound(c,1)
  d(c(j,1)) = 1
Next j

Targetrange.Resize(d.Count) = Application.Transpose(d.keys)
End If

希望你们清楚这一点。

提前致谢。

解决方法

Option Explicit

Sub macro1()
    Dim ws As Worksheet,aCell As Range,TargetRange As Range
    Dim ar As Variant,lr As Long,j As Long,c As Integer
    
    Dim d As Object,key As String
    Set d = CreateObject("Scripting.Dictionary")

    Set ws = Worksheets("DATASET")
    With ws
        Set aCell = .Range("A1") ' change
        c = aCell.Column
        lr = .Cells(Rows.Count,c).End(xlUp).Row
        ar = .Cells(1,c).Resize(lr).Value2
    End With

    For j = 1 To UBound(ar)
        key = Trim(ar(j,1))
        If Len(key) > 0 Then
            d(key) = 1
        End If
    Next

    Set TargetRange = Sheet2.Range("A1") ' change
    With TargetRange.Resize(d.Count)
        .NumberFormat = "@" ' text
        .Value2 = Application.Transpose(d.keys)
    End With
    MsgBox d.Count & " keys in d"

End Sub
,

如果您的 Targetrange 具有数字格式 General,它会将字符串 05 视为数字并将其转换为 5

因此,要么在添加值之前将数字格式更改为文本:

Targetrange.NumberFormat = "@"
Targetrange.Resize(d.Count) = Application.Transpose(d.keys)

或者在字典中每个条目之前添加一个 '

d("'" & c(j,1)) = 1

题外话:

Range() 方法可以获取单元格并且不需要地址,因此您可以从中删除 .Address()

Range(Cells(1,aCell.Column).Address(),Cells(lr,aCell.Column).Address())

然后写

 Range(Cells(1,aCell.Column),aCell.Column))

甚至更短:

 Cells(1,aCell.Column).Resize(RowSize:=lr)

如果它不是从第 1 行而是第 n 行开始,那么它是

 Cells(n,aCell.Column).Resize(RowSize:=lr - (n - 1))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。