求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题相关的知识,希望对你有一定的参考价值。

VBA代码如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TT = Cells(Target.Row, Target.Column).Address
' MsgBox TT
If Target.Column = 6 Then
With Me.ComboBox1

'.Visible = True
' .Width = Target.Width
' .Height = Target.Height
.Left = Target.Left
.Top = Target.Top
.Clear
.AutoSize = True
.AddItem "张三!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
.AddItem "李斯"
.AddItem "王武"
.AddItem "陶喆"

End With

End If
End Sub

Private Sub ComboBox1_Change()

If ComboBox1.Text <> "" Then

Range(TT) = ComboBox1.Text
'MsgBox TT

End If
'Me.ComboBox1.Visible = False
End Sub

其中TT是全局变量
Public TT As String

现在存在的问题是,我点击第6列,然后选择一个值后,再点选下一个第6列的其他单元格,下拉选框要点击2次才出现,请高手帮我解决问题.我使用的是excel 2010.
如果把ComboBox1_Change去掉就不会间隔出现下拉选框
还有另外一个问题就是怎么ComboBox1.top 调整到自动出现在单击的单元格下面而不是盖住单元格?

PS:请不要跟我说用 数据有效性做,可以用的话我一早就用了.

我的意图是做类似数据有效性的下拉列表, 除了可以选择下拉列表中的条件填充单元格,另外也可以自己填写自定义的内容到单元格里面.

参考技术A 使用动态数据有效性取代combobox可以解决上面的所有问题。
数据有效性取自工作表格2
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim s As String
Dim i As Integer
Dim n As Integer
n = Worksheets(2).Range("A500").End(xlUp).Row
If n = 1 Then
s = Worksheets(2).Range("A1")
Else
s = Worksheets(2).Range("A1")
For i = 2 To Worksheets(2).Range("A500").End(xlUp).Row
s = s & "," & Worksheets(2).Range("A" & i)
Next i
End If
If Target.Column = 6 Then
With Target.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=s
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.IMEMode = xlIMEModeNoControl
.ShowInput = True
.ShowError = True
End With
End If
End Sub追问

数据有效性可以不能解决我的问题吧?我后面补充了,我要填的内容是2中情况,如果在下拉列表可以找到,则直接选择,如果下拉列表找不到,则自己手工填写.数据有效性不能填充我自己手工填写的内容吧

Excel vba 仅自动填充空单元格

【中文标题】Excel vba 仅自动填充空单元格【英文标题】:Excel vba Autofill only empty cells 【发布时间】:2017-01-23 16:03:29 【问题描述】:

我有一列 A 的数据最多为 A300。

在此范围内,这些单元格中有些是空的,有些包含值。

在 VBA 中,我设置单元格 A1 的公式,然后使用自动填充功能将其设置在我的列中(最多 A300),如下所示:

ws.Range("A1").Select
Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1))

我的问题是某些单元格上包含的数据也被删除了!我正在尝试自动填充,但只能通过空单元格。

我试图像这样在我的工作表上添加一个过滤器:

ws.Range("$A$1:$A$300").AutoFilter Field:=1, Criteria1:="="

然后我重用了自动填充功能,但它似乎填充了过滤后的单元格......

我们不能在自动填充功能中添加“仅清空单元格”之类的参数吗?像这样的:

Selection.AutoFill Destination:=ws.Range(ws.Cells(1, 1), ws.Cells(300, 1)), Criteria1:="="

感谢您的回复!

【问题讨论】:

你想用什么来填充它们?静态的还是渐进的价值观?请参阅带有 xlCellTypeBlanks 的 Range.SpecialCells method。 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗? 【参考方案1】:

数据如下:

我会做一个单独的副本而不是填写:

Sub luxation()
    Range("A1").Formula = "=ROW()"
    Dim rDest As Range
    Set rDest = Intersect(ActiveSheet.UsedRange, Range("A1:A300").Cells.SpecialCells(xlCellTypeBlanks))

    Range("A1").Copy rDest
End Sub

结果如下:

注意:

公式复制后会调整。

编辑#1:

请注意,在某些情况下此代码不起作用。 UsedRange 可能没有向下延伸到单元格 A300

例如,如果工作表完全为空,除了 A1 中的公式和 A3 中的某些值。在这种情况下,Rdest 将只包含单个单元格 A2。代码将保持 A4A300 不变。

【讨论】:

感谢您的回答,这正是我所需要的。对于“usedRange”,我已经遇到了问题。当您删除某些数据或其他数据时,它似乎不会重新计算,但我可以在不使用 usedrange 的情况下这样做。再次感谢! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗?【参考方案2】:

假设您想要静态值,我会使用循环。下面的一个将用便便填充所有空单元格:

Sub AllFillerNoKiller()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")

For Each c In ws.Range("A1:A300")
    If c.Value = "" Then c.Value = "poop"
Next
End Sub

【讨论】:

谢谢,您的代码适用于 A1:A300 范围,但我使用的是作为示例,我的真实工作簿将有超过 10k 行,我会避免循环。但是感谢您的帮助!【参考方案3】:

抱歉,我没听懂你的问题 - 想用 A1 中的值填充所有空白单元格吗? - 给你:

Sub Replace()

If Trim(Range("A1").Value) = "" Then
    MsgBox "There's no value in A1 to copy so there's nothing to copy to all blank cells", vbInformation, "Nothing in A1"
    Exit Sub
    Else
        Range("A1:A300").SpecialCells(xlCellTypeBlanks).Select
        Selection.Value = Range("A1").Value
End If

End Sub

【讨论】:

谢谢这是更简单的答案! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗? 不完全确定问题出在哪里.. 第一行找到所有空单元格并选择它们,第二行将 A1 中的值输入到选定的单元格中,所以不可能......除非你单元格中有一个不被视为空白的空格(“”) - 这是怎么回事? 我使用的公式在单元格上放一个值,或者放“”。所以第一次,我的单元格是空的,然后公式把“”放在上面。第二次我通过错误运行我的宏结果。基本上,VBA 认为带有“”的单元格不是空白。空白单元格是未初始化的单元格。把“”放到一个单元格中初始化它。 specialcells(xlCellTypeBlanks) 不会将初始化的空单元格视为空白单元格,因此会导致错误... 如果你能看懂法语,这个话题可以清晰地解释问题:developpez.net/forums/d526009/logiciels/microsoft-office/excel/…【参考方案4】:

您也可以使用以下代码:

stAddress = Sheet1.Range("A1").CurrentRegion.SpecialCells(xlCellTypeBlanks).Address
Sheet1.Range(st).Value = "Empty"

【讨论】:

感谢此代码也有效,即使它比杰里米的答案更复杂。谢谢顺便说一句! 我还有一个关于“SpecialCells(xlCellTypeBlanks)”的问题。结果是如果复制然后粘贴一个空单元格,这些单元格不再被视为空白单元格,并且此代码未选择它(但此单元格仍然为空),这是 SpecialCells(xlCellTypeBlanks)的已知问题。所以即使我有一个空白单元格,我也会收到错误“没有单元格匹配”。你知道这个问题的任何解决方案吗?

以上是关于求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题的主要内容,如果未能解决你的问题,请参考以下文章

vba中怎么用代码将单元格内容转换为文本类型?

html表格里的单元格内容不能自动换行,求高手帮助解答!

请VBA高手帮忙,我要在EXCEL中插入一个控件,每次只要点击这个控件就能实现下面的功能

用VBA条件锁定EXCEL单元格的问题,高手进!

如何用VBA语句让EXCEL里某单元格不能被输入或更改?(比如说要让A1单元格不被输入)请诸路VBA高手赐教,谢谢!!

EXCEL根据单元格名称改变后自杀,求VBA代码!