Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Google工作表中编写的脚本迁移到VBA中的MS Excel宏?_Excel_Vba_Google Sheets - Fatal编程技术网

如何将Google工作表中编写的脚本迁移到VBA中的MS Excel宏?

如何将Google工作表中编写的脚本迁移到VBA中的MS Excel宏?,excel,vba,google-sheets,Excel,Vba,Google Sheets,我在Google app script中编写了一个脚本,用于搜索工作表中的值,并根据用户输入的值更新行。它与Google sheets配合良好。但当我将文档作为excel文件下载时,我甚至希望该脚本能够下载并转换为VBA宏,但这并没有发生,因为我没有任何编写VBA脚本的经验,所以有没有任何tol可以用来将.gs翻译成VBA。 以下是有帮助的功能: function test() { var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getS

我在Google app script中编写了一个脚本,用于搜索工作表中的值,并根据用户输入的值更新行。它与Google sheets配合良好。但当我将文档作为excel文件下载时,我甚至希望该脚本能够下载并转换为VBA宏,但这并没有发生,因为我没有任何编写VBA脚本的经验,所以有没有任何tol可以用来将.gs翻译成VBA。 以下是有帮助的功能:

function test() {
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');
  var spreadsheet = SpreadsheetApp.getActive();
  sheet2.getRange('B5:B7').activate();
  var idForSearch = sheet2.getRange("B5").getValue();
  var data = sheet1.getDataRange().getValues();
  var rownumber;
  for(var i = 0; i<data.length;i++){
    if(data[i][0] == idForSearch){ //[0] because column A
      Logger.log((i+1))
      rownumber= i+1;
    }
  }
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet1'), true);  
  spreadsheet.getRange('A'+rownumber+':'+'C'+rownumber).activate();
  spreadsheet.getRange('Sheet2!B5:B7').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, true);
};
功能测试(){
var sheet1=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet1');
var sheet2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet2');
var电子表格=SpreadsheetApp.getActive();
sheet2.getRange('B5:B7').activate();
var idForSearch=sheet2.getRange(“B5”).getValue();
var data=sheet1.getDataRange().getValues();
变量行数;

对于(var i=0;i请测试下一个代码。我没有要处理的数据,我只是在理论上做的,没有测试

Private Sub testConvert()
 Dim actWork As Workbook, sheet1 As Worksheet, sheet2 As Worksheet
 Dim data As Variant, i As Long, rownumber As Long, rng As Range

 Set actWork = ActiveWorkbook
 Set sheet1 = actWork.Sheets("Sheet1")
 Set sheet2 = actWork.Sheets("Sheet2")
 actWork.Activate
   idForSearch = shee2.Range("B5").Value
   data = sheet1.Range("B5:B7").Value 'not necessary to be activated

   For i = 1 To UBound(data) 'in VBA such an array (created from a range) is 1 based...
        If UCase(data(i,1)) = UCase(idForSearch) Then 'VBA is case sensitive
            WriteLog i 'you must have a function ('WriteLog') able to do it...
            rownumber = i
            'if you have only one occurrence, it is good to exit the loop to save time (not for this specific case of 3 times):
            Exit For
            'If many occurrences may be, you just comment the line above...
        End If
   Next i
   sheet1.Activate 'not necessary
   Set rng = sheet1.Range("A" & rownumber & ":" & "C" & rownumber).Select
   sheet2.Range("B5:B7").Value = WorksheetFunction.Transpose(rng.Value)
End Sub
最后一个编码行将
sheet1的水平范围转置到
sheet2的列范围上


如果您能告诉我更多细节,我可以在函数
WriteLog
创建方面帮助您:它必须是什么类型的日志(文本文件),在要创建、查找的路径上,等等。是否要添加、附加
i
值,或者如果已经记录了任何值,是否要重写现有值?

是否要将范围
'A'+行号+:'+'C'+行号
转换到列
B5:B7
?我要转换在B5:B7中输入的数据(用户说)并将其粘贴到Sheet1中的a:C行上,这可以被认为是一个包含id所有可能值的数据库。我必须找到id记录存在的行,然后更新它。我只想找到是否有id输入B5单元格(Sheet2)中的行存在于工作表1中,如果存在,则我应该能够使用转置copy覆盖该行中列的内容。我从您的代码中了解到了这一点,但是否只有一次出现?您是否测试了上述代码?如果出现更多出现,则必须更新代码,但我需要了解上下文…不,我没有需要多个匹配项,因此只有一个匹配项应该可以,如您的答案所示(Sheet1中的A列将具有唯一ID)。我测试了您的代码,但我在data(I)处得到的下标超出范围。对不起,请检查更新的代码。我刚刚用
数据(I)替换了
数据(I)
。在VBA中有两种数组类型。当它来自VBA使用的范围时(数组)行和列。即使只涉及一列,您也必须使用它…@soumitra goswami:好的。在这种情况下,最好知道您可以使用
Debug.Print i+1
并在VBE中使用
Ctrl+G
打开即时窗口,以查看结果。。。