wps实现多选下拉框3种方案

一、js宏listbox控件方案

优点:

1.wps默认宏环境,无需安装VBA环境

2.下拉框位置定位准确

缺点:

1.下拉框数据无法代码初始化,只能使用区域设置

2.一次只能选一个,多次选择实现多选

操作步骤:

1.工具->开发工具->拖动一个列表框到工作表

2.双击控件 或 查看代码,进入代码编辑

3.代码编辑的时候头上可以选择不同的事件进行监听处理

4. 右击控件可以进行属性设置

配置:

 

 

代码:

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.一次只能选一个,多次选择实现多选

操作步骤:

1.工具->开发工具->WPS宏编辑器 或者 查看代码,进入代码编辑

2. 新增窗体UserForm1,并拖动一个ListBox到form中

3. 代码编辑的时候头上可以选择不同的事件进行监听处理

配置:

 

代码:

//窗体初始化
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环境

步骤:

1.工具->开发工具-> VB编辑器 或 查看代码,进入代码编辑

2.代码编辑的时候头上可以选择不同的事件进行监听处理

3. 右击控件可以进行属性设置

配置:

 

代码:

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)
Next

ActiveCell = Mid(t, 2)

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ListBox1
        '第 2 列 且 单元格大于 1,因为表头的字段不需要进行多选
        If ActiveCell.Column = 2 And ActiveCell.Row > 1 Then
            t = ActiveCell.Value
            
            Reload = True '如果是根据单元格的值修改列表框,则暂时屏蔽listbox的change事件。
            
            For i = 0 To .ListCount - 1 '根据活动单元格内容修改列表框中被选中的内容
                If InStr(t, .List(i)) Then
                    .Selected(i) = True
                Else
                    .Selected(i) = False
                End If
            Next
            
            Reload = False
            
            .Top = ActiveCell.Top + ActiveCell.Height '以下语句根据活动单元格位置显示列表框
            .Left = ActiveCell.Left
            .Width = ActiveCell.Width
            .Visible = True
        Else
            .Visible = False
        End If
    End With
End Sub

 效果:

 

posted @ 2025-03-18 18:25  追极  阅读(2264)  评论(0)    收藏  举报