2011-09-27 200 views
2

我有一个Excel文件(.xlsm),里面有一个宏。我想将这个Excel文件上传到服务器上,让C#执行它而不是VBA宏。这个宏看起来很简单,但我不太了解它将其转换为C#。下面是宏代码:将Excel宏转换为C#?

Sub publishpages() 

    'calculate how many iterations 
    x = 0 
    Sheets("pagegen").Select 
    Range("n1").Select 
    Range("n1").Copy 
    numberOfPages = ActiveCell.Value 

    'step through and select each sample 
    For x = 0 To numberOfPages 

     Sheets("listsample").Select 
     Range("A2").Select 
     ActiveCell.Offset(x, 0).Range("A1").Select 
     Selection.Copy 
     Sheets("pagegen").Select 
     Range("l1").Select 
     ActiveSheet.Paste 

     'name folder and filename 
     Sheets("pagegen").Select 
     Range("ac2").Select 
     Range("ac2").Copy 
     foldername = ActiveCell.Value 

     'publish pages 
     Range("d3:q80").Select 
     Application.CutCopyMode = False 
     Selection.Copy 
     ActiveWorkbook.PublishObjects.Add(xlSourceRange, "C:\Temp\" & foldername, "pagegen", "$d$3:$q$80", xlHtmlStatic, "sampleweb11 current_22", "").Publish (True) 

    Next x 

End Sub 

因为我计划在一台服务器上运行此,我要寻找一个托管库,所以我没有在服务器上安装Office。这就是我正在看的,它甚至支持Linq:http://epplus.codeplex.com

有关如何启动它的任何想法?

+0

考虑使用VB.NET,因为它处理_Office.Interop_好得多。而不是使用'.Select','.Copy'和'.Paste'命令的剪贴板考虑使用直接赋值('Range [xx] .Value2 = Range [yy] .Value2') – ja72

+0

重构肯定会有帮助代码转换)。你可以发布重构版本作为你的答案,我会接受。这会帮助我理解这是在做什么。 – TruMan1

回答

1

这里是重构的代码:

Option Explicit 
Sub publishpages() 
    Dim x As Long, numberOfPages As Long 
    Dim folderName As String 
    numberOfPages = Sheets("pagegen").Range("n1").Value 

    For x = 0 To numberOfPages 
     Sheets("pagegen").Range("l1") = Sheets("listsample").Range("A2").Offset(x, 0).Range("A1") 
     folderName = Sheets("pagegen").Range("ac2") 
     ActiveWorkbook.PublishObjects.Add(xlSourceRange, "C:\Temp\" & folderName, "pagegen", "$d$3:$q$80", xlHtmlStatic, "sampleweb11 current_22", "").Publish (True) 
    Next x 
End Sub