请教优化WPS宏代码

刚学习wps宏代码
请教怎么优化代码

function 保存并清除()
{    
    var x=Sheets("出货明细").Cells(Rows.Count,1).End(xlUp).Row+1;
    Sheets.Item("销售单").Activate();
    if(Cells(5,3).Value2!=undefined)
    {
        for(var i=9;i<=17;i++)
        {
            Sheets.Item("销售单").Activate();
            if(Cells(i,2).Value2!=undefined)
            {
    //第一列
    Sheets.Item("销售单").Activate();
    Range("G4").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,1).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第二列
    Sheets.Item("销售单").Activate();
    Range("K20").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,2).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第三列
    Sheets.Item("销售单").Activate();
    Range("C5").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,3).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第四列
    Sheets.Item("销售单").Activate();
    Range("B"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,4).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第五列
    Sheets.Item("销售单").Activate();
    Range("D"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,5).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第六列
    Sheets.Item("销售单").Activate();
    Range("E"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,6).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第七列
    Sheets.Item("销售单").Activate();
    Range("F"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,7).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第八列
    Sheets.Item("销售单").Activate();
    Range("G"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,8).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第九列
    Sheets.Item("销售单").Activate();
    Range("H"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,9).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十列
    Sheets.Item("销售单").Activate();
    Range("I"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,10).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十一列
    Sheets.Item("销售单").Activate();
    Range("J"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,11).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十二列
    Sheets.Item("销售单").Activate();
    Range("K"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,12).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
     //第十三列
    Sheets.Item("销售单").Activate();
    Range("M"+i).Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,13).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
      //第十四列
    Sheets.Item("销售单").Activate();
    Range("G5").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,14).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十五列
    Sheets.Item("销售单").Activate();
    Range("L5").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,15).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十六列
    Sheets.Item("销售单").Activate();
    Range("C6").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,16).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);
    //第十七列
    Sheets.Item("销售单").Activate();
    Range("G6").Select();
    Selection.Copy(undefined);
    Sheets.Item("出货明细").Activate();
    Cells(x,17).Select();
    Selection.PasteSpecial(xlPasteValues, xlPasteSpecialOperationNone, false, false);

    var    x=x+1
            }
        }    
    }
    else{MsgBox("        未输入客户名")}
        Sheets.Item("销售单").Activate();
        if(Cells(5,3).Value2!=undefined)
        {
            Range("B9:G17,I9:J17,M9:M17,C5:E6,G5:I6,L5:M5").ClearContents();
            Range("C5").Select();
            ActiveWorkbook.Save();}
        else{Range("C5").Select()}
}



img

思路:1用Range.Value2获取二维数组数据;2用forEach循环数组;3用Range.Resize.Value2方法写入数据
代码:

function 保存并清除() {
    let thiswb = ThisWorkbook
        , sell = thiswb.Sheets('销售单')
        , detail = thiswb.Sheets('出货明细')
        , sell_list = sell.Range('B9:M17').Value2
        , ros = detail.Cells(Rows.Count, 1).End(xlUp).Row + 1
        , head = [sell.Range('G4').Value2, sell.Range('K20').Value2, sell.Range('C5').Value2]
        , tail = [sell.Range('G5').Value2, sell.Range('L5').Value2, sell.Range('C6').Value2, sell.Range('G6').Value2]

    if (!sell.Range('C5').Value2) {
        sell.Range('C5').Select()
        return alert('未填写客户名称')
    }

    sell_list.forEach(i => {
        if (!i[0]) return
        i.splice(1, 1)
        i.splice(9, 1)
        i = head.concat(i)
        i = i.concat(tail)
        detail.Range('A' + ros).Resize(1, 17).Value2 = i
        ros++
    })
    detail.Columns(1).NumberFormatLocal = "yyyy/m/d;@"
    detail.Columns(2).NumberFormatLocal = "yyyy/m/d h:mm;@"
    sell.Range('B9:M17,C5:E6,G5:I6,L5:M5').Value2 = ''
    sell.Range('C5').Select()
    thiswb.Save()
}

效果:

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 看下这篇博客,也许你就懂了,链接:【WPS表格】常见的错误值/出错原因与解决方法
  • 除此之外, 这篇博客: WPS加载项介绍中的 4. WPS 加载项的三种交互方式 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    自定义菜单

            自定义功能区采用通用的

    CustomUI 标准进行配置, 该标准定义了一整套标准的控件,比如按钮、下拉菜单、组合框;能够对控件的标签、图标、点击事件等属性进行配置。下面通过一个示例进行详细说明。

     

    自定义任务窗格

            WPS 加载项的任务窗格是一个用来浏览网页的用户界面面板,通常停靠在 WPS 应用程序主窗口的一侧,开发者可以控制任务窗格停靠的位置及宽高。 但重要的是任务窗格中的这个网页可以和 WPS 直接完成交互,开发者可以提取 WPS 文档中的数据在网页中集中显示,也可以通过网页交互将数据直接写进文档。

    自定义 WEB 对话框

            根据给定的url、标题、宽高等信息创建一个对话框,对话框中的内容是一个web网页。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^