Проблема в копировании данных одного Excel в другой Excel с использованием VBSCript - PullRequest
0 голосов
/ 04 января 2010

У меня есть лист Excel, который содержит около 1000 строк данных, я скопировал эти данные на другой лист, который удовлетворяет условию. Чтобы достичь этого, я написал скрипт,

For m = 1 To x2 'iterate single column
  For n = 1 To x4 'iterate PM_DUMP
    If InStr(PMSheet.cells(n,6).value, dupSingle.cells(m,1).value) > 0 Then
      ' For p = 1 To y4
      wsc.Activate
      wsc.Rows.Item(n).Select
      wsc.Application.Selection.Copy
      wsb.Activate
      wsb.Rows(m).Select
      wsb.paste 
      wsc.Application.CutCopyMode = False
      On Error Resume Next
      Exit For 
    End If
  Next
Next
GetExcel2.Save

Выполнение сценария идет хорошо до определенного уровня, скажем, 350 строк, следующая строка была скопирована нормально, но через несколько минут вся строка была выделена красным цветом, я получаю сообщение об ошибке «EXCEL Обнаружил ошибку» он закрывает рабочую книгу и открывает новый лист без каких-либо данных ...

Любая помощь для решения этой проблемы высоко ценится.

С уважением, Ramesh.T

Ответы [ 3 ]

1 голос
/ 05 января 2010

Попробуйте объединить копию и вставку в один шаг. Заменить весь этот код

wsc.Activate
wsc.Rows.Item(n).Select
wsc.Application.Selection.Copy
wsb.Activate
wsb.Rows(m).Select
wsb.paste 
wsc.Application.CutCopyMode = False
wsc.Application.CutCopyMode = False
On Error Resume Next

с

wsc.Rows(n).Copy wsb.Rows(m)
1 голос
/ 04 января 2010

Иногда мне было проще работать с данными Excel через интерфейс OLEDB. Затем вы просто обрабатываете два листа как две таблицы со стандартными операциями DataTable вместо более непостоянных операций автоматизации. У меня есть только готовый пример для чтения данных, но, надеюсь, вы также можете экстраполировать операции записи:

    /// <summary>
    /// Reads an Excel spreadsheet into a new DataTable.
    /// </summary>
    /// <param name="xlsFile">The full file path of the Excel workbook to read from.</param>
    /// <param name="sheetName">The name of the sheet in the workbook to read.</param>
    /// <param name="tableName">The name to give the new DataTable that the spreadsheet is read into.</param>
    /// <param name="firstRowIsHeader">Indicates wheather or not the first row of the spreadsheet is a header row.</param>
    /// <returns></returns>
    internal static DataTable XlsToDataTable(string xlsFile, string sheetName, string tableName, bool firstRowIsHeader)
    {
        var dt = new DataTable(tableName);
        var yesNo = firstRowIsHeader ? "Yes" : "No";
        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + xlsFile + ";Extended Properties='Excel 8.0;HDR=" + yesNo + ";IMEX=1';";
        using (var ocn = new OleDbConnection(connStr ))
        {
            var cmd = new OleDbCommand("Select * from [" + sheetName + "$]", ocn);
            var datadapt = new OleDbDataAdapter {SelectCommand = cmd};
            datadapt.Fill(dt);
        }
        return dt;
    }
0 голосов
/ 04 января 2010

По моему опыту .Paste работает не очень хорошо, поэтому я бы порекомендовал вам изменить

wsb.paste 

до

wsb.pastespecial

У вас все еще есть проблемы, если вы измените это?

UPDATE:

Я не уверен, изменит ли это какую-либо разницу в выполнении, но я думаю, что средняя часть сложнее, чем нужно - работает ли она, если заменить среднюю часть цикла следующим кодом: 1013 *

  wsc.Activate 
  wsc.Rows(m).Item.Copy 
  wsb.Activate 
  wsb.Rows(n).PasteSpecial

Таким образом, вам также не нужно устанавливать CutCopyMode = False до тех пор, пока вы полностью не закончите с циклами, поэтому он должен быть быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...