一、js宏listbox控件方案
优点:
1.wps默认宏环境,无需安装VBA环境
2.下拉框位置定位准确
缺点:
1.下拉框数据无法代码初始化,只能使用区域设置
2.一次只能选一个,多次选择实现多选
配置:
代码:
function ListBox1_Click() {var cellValue = new String(ActiveCell.Value2);var listVal = ListBox1.Value;if(cellValue=="undefined"){ActiveCell.Value2=listVal;}else{if(!cellValue.includes(listVal)){ActiveCell.Value2=cellValue+","+listVal;}else{ActiveCell.Value2= removeCharFromList(cellValue,listVal);}}}// 删除字符串中的某个子串 function removeCharFromList(str, charToRemove) {return str.split(',').filter(char => char !== charToRemove).join(','); }function Workbook_SheetSelectionChange(Sh, Target) {if(ActiveCell.Column==2 && ActiveCell.Row>1){ListBox1.Top=ActiveCell.Top+ActiveCell.Height;ListBox1.Left=ActiveCell.Left+ActiveCell.Width;ListBox1.Width=ActiveCell.Width;ListBox1.Visible=true;}else{ListBox1.Visible=false;} }
二、js宏listbox+form窗体方案
优点:
1.wps默认宏环境,无需安装VBA环境
2.下拉框数据可以代码初始化,无需区域设置
缺点:
1.下拉框位置无法精准定位
2.一次只能选一个,多次选择实现多选
代码:
//窗体初始化 function UserForm1_Initialize() {//下拉框初始化选项var items = ["东", "南", "西", "北"];for (var i = 0; i < items.length; i++) {UserForm1.ListBox1.AddItem(items[i],i);} }//选区改变事件 function Workbook_SheetSelectionChange(Sh, Target) {if(ActiveCell.Column==2 && ActiveCell.Row>1){//显示窗体 UserForm1.Show(); }else{//隐藏窗体 UserForm1.Hide();} }//下拉框点击事件 function UserForm1_ListBox1_Click() {//获取单元格的值var cellVal = new String(ActiveCell.Value2);//获取下拉框选中的值var listBoxVal = UserForm1.ListBox1.Value;if(cellVal=="undefined"){//第一次选中ActiveCell.Value2 = listBoxVal;}else{if(!cellVal.includes(listBoxVal)){//添加选项ActiveCell.Value2 = cellVal+","+listBoxVal;}else{//删除选项ActiveCell.Value2 = removeCharFromList(cellVal,listBoxVal);}}UserForm1.Hide();//选择其它单元格,模拟失焦var adderss = "C"+ActiveCell.Row;ActiveSheet.Range(adderss).Select(); }// 删除字符串中的某个子串 function removeCharFromList(str, charToRemove) {return str.split(',').filter(char => char !== charToRemove).join(','); }
三、vb宏listbox方案
优点:
1.支持多选,一次选多个
2.下拉框位置定位准确
缺点:
1.需要安装VBA环境
配置:
代码:
Private Sub ListBox1_Change()If Reload Then Exit Sub 'ListBox1改变事件For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) = True Then t = t & "," & ListBox1.List(i) NextActiveCell = Mid(t, 2)End SubPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)With ListBox1'第 2 列 且 单元格大于 1,因为表头的字段不需要进行多选If ActiveCell.Column = 2 And ActiveCell.Row > 1 Thent = ActiveCell.ValueReload = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容If InStr(t, .List(i)) Then.Selected(i) = TrueElse.Selected(i) = FalseEnd IfNextReload = False.Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框.Left = ActiveCell.Left.Width = ActiveCell.Width.Visible = TrueElse.Visible = FalseEnd IfEnd With End Sub