JScript使用Excel TextToColumns
我一直在努力使这个小片段工作,但我一直在失败悲惨。 该脚本似乎工作正常,但事情是:我需要第三列(数字的一个)被转换为文本。
看看Excel中的帮助页面,似乎“数组(3,2)”部分将使它成为可能,但即使尝试了很多这个函数的数字和参数的组合,我不能使它的工作。
任何帮助这个问题?
var app = new ActiveXObject("Excel.Application"); app.Visible = true; var xls = app.Workbooks.Add(); app.Cells(1, 1).Value = "Olympia, WA, 123"; app.Cells(2, 1).Value = "Salem, OR, 3434"; app.Cells(3, 1).Value = "Boise, ID, 342"; app.Cells(4, 1).Value = "Sacramento, CA, 3"; app.Range("A1").EntireColumn.TextToColumns(app.Range("B1"),1,1,false,false,false,true,false,false,Array(3, 2));
这里有两个问题。
第一个问题是您正在使用FieldInfo参数的格式不正确。 该参数应该是一个数组的数组。 这种数组的JScript格式如下所示:
// 2 = xlTextFormat [[1, 2], [2, 2], [3, 2]] // or, if you prefer using the Array() function: Array(Array(1, 2), Array(2, 2), Array(3, 2))
(在我的testing中,我必须指定所有三列,如果你不关心其他列,请将xlGeneralFormat的每个数组的第二项设置为1)。
但是,并不是那么简单,因为像大多数COM对象那样,Excel需要数组是一个SAFEARRAY结构。 在VBScript中,这不是问题,因为它的数组是使用SAFEARRAYs实现的,但在JScript中,数组本质上是一种特殊types的对象,不易转换为SAFEARRAY(您可以从Eric Lippert的博客如果你想要更多的细节)。 没有将JScript数组转换为SAFEARRAY的内置方法,尽pipe有解决方法(例如,请参阅此SO问题 )。
第二个问题是你实际上缺less一个参数OtherChar 。 即使文档声明只有当Other为True
时,此参数才是必需的,但仍然需要提供一些值,因为JScript中没有可选参数。 在下面的示例中,我展开了函数调用,并使用文档中的参数名称来标记每行,以便清楚地说明:
var app = new ActiveXObject("Excel.Application"); app.Visible = true; var xls = app.Workbooks.Add(); app.Cells(1, 1).Value = "Olympia, WA, 123"; app.Cells(2, 1).Value = "Salem, OR, 3434"; app.Cells(3, 1).Value = "Boise, ID, 342"; app.Cells(4, 1).Value = "Sacramento, CA, 3"; app.Range("A1").EntireColumn.TextToColumns( app.Range("B1"), // Destination 1, // DataType 1, // TextQualifier false, // ConsecutiveDelimiter false, // Tab false, // Semicolon true, // Comma false, // Space false, // Other '', // OtherChar getSafeArray([ getSafeArray([1, 2]), getSafeArray([2, 2]), getSafeArray([3, 2]) ]) // FieldInfo ); // ref: https://stackoverflow.com/a/5910730 function getSafeArray(jsArr) { var dict = new ActiveXObject("Scripting.Dictionary"); for (var i = 0; i < jsArr.length; i++) dict.add(i, jsArr[i]); return dict.Items(); }
FieldInfo参数需要是一个数组Array,而不是在您调用本地JScript Array构造函数时不需要新build的东西。
所以通过单独修改列来降低复杂性:
app.Range("A1").EntireColumn.TextToColumns(app.Range("B1"),1,1,false,false,false,true,false,false); app.Range("D1").EntireColumn.NumberFormat = "@"
- 如何创build这个特定的if / excel公式?
- 使用VBA将CSV文件读入excel,然后将结果输出到特定的工作表
- VBA删除两个特定字符之间的string的子string
- Excel VBA,打开url,无需打开浏览器
- Excel Office加载项API工作表保护密码
- 将excel工作簿中的第一行复制到一个新的excel工作簿中
- Excel VBA:ComboBox.Rowsource值的dynamic范围在userForm从commandbutton调用时不显示
- VBA:从服务器获取/下载Excel文件并将内容复制到新的工作表中
- 如何通过VBA命令修复“错误的string值错误”? (Excel连接到MySQL)