答案1
我制作了一个下拉菜单(数据验证),我想从下拉菜单中选择多个选项
这是可能的,尽管我需要 VBA 来实现这一点。
我当前使用的代码是这样的:
Private Sub Worksheet_Change(ByVal 目标作为范围) ' Vars 来存储我们正在更改的单元格的内容。 Dim oldVal 作为字符串 Dim newVal 作为字符串 ' 在范围内 Dim rngDV 作为范围 '我们甚至不会尝试同时处理多个细胞。 如果 Target.Count > 1 则转到 exitHandler “我们被叫来是因为一个细胞正在发生变化。 ' 如果是下拉列表,则我们要采取行动。如果不是,则跳过下拉代码一直退出) 出错时继续下一步 设置 rngDV = Cells.SpecialCells(xlCellTypeAllValidation) 发生错误时转到 exitHandler ' rngDv 填充了 Cells.SpecialCells(xlCellTypeAllValidation) ' 可以为空。在这种情况下,跳至结尾。 如果 rngDV 为 Nothing,则转到 exitHandler ' 以复杂的方式检查我们的小区是否在范围内。 '如果不是 insersect 可能会更干净。然后我可以删除 else。 如果 Intersect(Target, rngDV) 为 Nothing,则 '没做什么 别的 '好的,我们正在更改范围内的一个下拉列表。 ' 阻止新的更改,直到我们完成为止。 应用程序.启用事件 = False ' Excel 已将新值写入单元格。 '这个新的价值将取代我们自己的内容。 这里有三个选项: ' 1) 我们第一次增加了一个值。 ' 2)我们已经有一个值,打开了下拉菜单,但没有选择任何东西 ' 3)我们有一个值,并选择一个新选项 -> 需要执行的操作是附加,而不是替换 ' 拯救字符串中的新值 newVal = 目标值 ' 我们还想要旧值,但目前它已经消失了。让我们进行通用撤消以将其恢复。 应用程序.撤消 旧值 = 目标值 ' 用新内容重新替换。 “如果我们的特殊行动处于范围内,我们稍后会再次这样做。 “如果我们不在我们的特殊部门,不更换,那么我们有效 ' 阻止所有更改。这不是我们所希望的。 目标值 = newVal ' 我们是否在 [BC,BJ] 范围内? '(AZ = 1-26,AA-AZ 为 27,52,... ‘ 如果 (目标列 >= 55 且目标列 2) 则 如果 (oldVal = "" 或 newVal = "") 那么 '如上所述的情况 1 或情况 2 别的 ' 最后,实际行动代码! ' 返回一个整数,指定一个字符串在另一个字符串中第一次出现的起始位置。 ' https://msdn.microsoft.com/en-us/library/8460tsh1%28v=vs.90%29.aspx ‘ ' 我们将使用它来对旧单元格内容和新条目进行模式 1(文本)比较。 ' 如果新条目已经位于旧字符串的某个位置,则 instr 返回其位置。 ‘ ' 创造性地使用它来检查值是否存在(我们不关心字符串中的位置)。 ‘ 如果 (InStr(1, oldVal, newVal)) > 0 则 '如果我们的牢房里已经有了相同的答案。 ' 我们不会将其附加并因此再次添加,而是将其删除。 ' 这样就能轻松地从列表中删除选择,即使我们已经有一长串的条目。 ' https://msdn.microsoft.com/en-us/library/dxs6hz0a%28v=vs.90%29.aspx ' Right 返回一个我们可以比较的字符串。 如果 Right(oldVal,Len(newVal)) = newVal 则 目标值 = 左(旧值,Len(旧值) - Len(新值) - 2) 别的 ' 替换 ( 字符串 1,查找,替换,[开始,[计数,[比较]]] ) ‘ ' 在字符串中搜索旧答案。 ' 表示“新价值”, ' 并将其替换为无内容以将其删除。 ‘ 目标值 = Replace(oldVal, newVal & ", ", "") 万一 别的 ' 附加新的更改。添加逗号作为 cvs 分隔符。 目标值 = 旧值 & ", " & 新值 万一 万一 万一 ' 如果相交(目标,rngDV)结束 万一 退出处理程序: 应用程序.启用事件 = True 子目录结束
这是我第一次尝试使用 VBA,有些值是硬编码的。
(例如If (Target.Column >= 55 And Target.Column <= 62 And Target.Row > 2)
选择我正在操作的范围)。
这有效地将所有选择合并到一个单元格中,以逗号分隔。如果您想对这些数据采取行动,则需要再次对其进行标记,或者使用 if 语句来涵盖所有可能的组合。
并在下方单元格中显示值。
当然可以复制单元格。当前代码会合并所有选择(如果选择两次,则会删除一个),并将其作为字符串放入单元格中。可以使用标准 Excel 功能将该字符串复制到任何位置。
答案2
如果您指的是基于所选月份的下拉列表,则必须写下您的月份,然后在每个月份的标题列中输入相应的值,然后定义此列的名称,如月份名称,然后通过数据验证在设置中选择列表,然后=间接(月份参考)一月二月三月然后在另一列一月值1值2值3 ...选择并将名称定义为一月在二月信息1信息2信息3 ...中选择并定义名称二月...在您选择月份的工作表中(B2)使用数据验证列表在另一个单元格中为月份制作数据验证设置列表和来源=间接(B2)