Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/несоответствие типов - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
несоответствие типов
ilikeread Дата: Пятница, 14.02.2014, 13:10 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Уважаемые Гуру.

Помогите пожалуйста поправить макрос.
Не пойму в чём может быть проблема.
Ошибка периодическая, то есть возникает не каждый день, а хрен знает как. Вчера всё работало, сегодня не хочет, завтра будет работать опять.

Выдаёт ошибку
Run-time error '13':
Type mismatch

подсвечивает жёлтым строку

[vba]
Код
  If rCell.Value = "Дата:" Then
[/vba]

Файл никак ужать до 100Kb не могу. если нужно выложу на файлообменник.

весь макрос полностью:

[vba]
Код
Sub SAVE() 'занесение Кп в таблицу и сохранение Кп и сметы
Application.ScreenUpdating = False

Dim rCell As Range, rRange As Range, rTable As Long
With CreateObject("Scripting.Dictionary")
     Set rRange = Sheets("КП (комплект)").UsedRange
         For Each rCell In rRange
             If rCell.Value = "Дата:" Then
                 .Add Key:="дата", Item:=rCell.Offset(0, 1).Value
             End If
              
             If rCell.Value = "Номер:" Then
                 .Add Key:="Номер", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "Описание" Then
                 .Add Key:="Наименование Оборудования", Item:=rCell.Offset(1, 0).Value
             End If
             If rCell.Value = "ИТОГО:" Then
                 .Add Key:="Итого", Item:=rCell.Offset(0, 2).Value
             End If
             If rCell.Value = "Коммерческое предложение для" Then
                 .Add Key:="Покупатель", Item:=rCell.Offset(0, 2).Value
             End If
             If rCell.Value = "Для:" Then
                 .Add Key:="Пользователь", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "г. " Then
                 .Add Key:="Город", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "конт:" Then
                 .Add Key:="Контакт", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "тел:" Then
                 .Add Key:="Телефон", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "Дата:" Then
                 .Add Key:="Дата", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "E-mail:" Then
                 .Add Key:="E-mail", Item:=rCell.Offset(0, 1).Value
             End If
          Next

     For i = 1 To Sheets.Count 'проверка на уникальность номера КП
         If Sheets(i).Name = .Item("Номер") Then
             MsgBox "Такой номер КП уже сохраняли": Exit Sub
         End If
     Next
rTable = Sheets("таблица").UsedRange.Rows.Count + 1
'Заполнение таблицы
Sheets("таблица").Cells(rTable, 1).Formula = .Item("Дата")
Sheets("таблица").Cells(rTable, 2).Formula = .Item("Номер")

Name = .Item("Номер")
Sheets("таблица").Hyperlinks.Add Anchor:=Sheets("таблица").Cells(rTable, 2), Address:="", SubAddress:= _
         "'" + Name + "'" + "!A1", TextToDisplay:=Name  'Создание гиперссылки на лист

Sheets("таблица").Cells(rTable, 3).Formula = .Item("Наименование Оборудования")
Sheets("таблица").Cells(rTable, 4).Formula = .Item("Итого")
Sheets("таблица").Cells(rTable, 5).Formula = .Item("Покупатель")
Sheets("таблица").Cells(rTable, 6).Formula = .Item("Пользователь")
Sheets("таблица").Cells(rTable, 7).Formula = .Item("Город")
Sheets("таблица").Cells(rTable, 8).Formula = .Item("Контакт")
Sheets("таблица").Cells(rTable, 9).Formula = .Item("Телефон")
Sheets("таблица").Cells(rTable, 10).Formula = .Item("E-mail")

'Перенос  Кп на лист
Sheets("КП (комплект)").Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).UsedRange.Value = Sheets(Sheets.Count).UsedRange.Value
Sheets(Sheets.Count).Name = .Item("Номер")
'удаление кнопки
ActiveSheet.Shapes.Range(Array("Button 1")).Select
Selection.Delete
Selection.Cut
      
'защита листа от изменений
ActiveSheet.Cells.Select
Selection.Locked = True
Selection.FormulaHidden = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

      
' Создание сметы отдельным файлом
ActiveSheet.Copy        'копирование листа в новую книгу
'Сохранение в нужной папке с нужным именем.
ActiveWorkbook.SaveAs "N:\MyDoc\11 КП\Сметы14\Смета на КП №" & Name & " " & Range("N19").Text & " " & Range("O19").Text & ".xls", FileFormat:=xlExcel8
ActiveWorkbook.Close

'Сохранение в ПДФ
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"N:\MyDoc\11 КП\Кп14\КП №" & Name & " " & Range("N19").Text & " " & Range("O19").Text & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:= _
True

ActiveWorkbook.SAVE

Sheets("КП (комплект)").Activate

End With

MsgBox "Записано"
Application.ScreenUpdating = True

End Sub
[/vba]
 
Ответить
СообщениеУважаемые Гуру.

Помогите пожалуйста поправить макрос.
Не пойму в чём может быть проблема.
Ошибка периодическая, то есть возникает не каждый день, а хрен знает как. Вчера всё работало, сегодня не хочет, завтра будет работать опять.

Выдаёт ошибку
Run-time error '13':
Type mismatch

подсвечивает жёлтым строку

[vba]
Код
  If rCell.Value = "Дата:" Then
[/vba]

Файл никак ужать до 100Kb не могу. если нужно выложу на файлообменник.

весь макрос полностью:

[vba]
Код
Sub SAVE() 'занесение Кп в таблицу и сохранение Кп и сметы
Application.ScreenUpdating = False

Dim rCell As Range, rRange As Range, rTable As Long
With CreateObject("Scripting.Dictionary")
     Set rRange = Sheets("КП (комплект)").UsedRange
         For Each rCell In rRange
             If rCell.Value = "Дата:" Then
                 .Add Key:="дата", Item:=rCell.Offset(0, 1).Value
             End If
              
             If rCell.Value = "Номер:" Then
                 .Add Key:="Номер", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "Описание" Then
                 .Add Key:="Наименование Оборудования", Item:=rCell.Offset(1, 0).Value
             End If
             If rCell.Value = "ИТОГО:" Then
                 .Add Key:="Итого", Item:=rCell.Offset(0, 2).Value
             End If
             If rCell.Value = "Коммерческое предложение для" Then
                 .Add Key:="Покупатель", Item:=rCell.Offset(0, 2).Value
             End If
             If rCell.Value = "Для:" Then
                 .Add Key:="Пользователь", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "г. " Then
                 .Add Key:="Город", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "конт:" Then
                 .Add Key:="Контакт", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "тел:" Then
                 .Add Key:="Телефон", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "Дата:" Then
                 .Add Key:="Дата", Item:=rCell.Offset(0, 1).Value
             End If
             If rCell.Value = "E-mail:" Then
                 .Add Key:="E-mail", Item:=rCell.Offset(0, 1).Value
             End If
          Next

     For i = 1 To Sheets.Count 'проверка на уникальность номера КП
         If Sheets(i).Name = .Item("Номер") Then
             MsgBox "Такой номер КП уже сохраняли": Exit Sub
         End If
     Next
rTable = Sheets("таблица").UsedRange.Rows.Count + 1
'Заполнение таблицы
Sheets("таблица").Cells(rTable, 1).Formula = .Item("Дата")
Sheets("таблица").Cells(rTable, 2).Formula = .Item("Номер")

Name = .Item("Номер")
Sheets("таблица").Hyperlinks.Add Anchor:=Sheets("таблица").Cells(rTable, 2), Address:="", SubAddress:= _
         "'" + Name + "'" + "!A1", TextToDisplay:=Name  'Создание гиперссылки на лист

Sheets("таблица").Cells(rTable, 3).Formula = .Item("Наименование Оборудования")
Sheets("таблица").Cells(rTable, 4).Formula = .Item("Итого")
Sheets("таблица").Cells(rTable, 5).Formula = .Item("Покупатель")
Sheets("таблица").Cells(rTable, 6).Formula = .Item("Пользователь")
Sheets("таблица").Cells(rTable, 7).Formula = .Item("Город")
Sheets("таблица").Cells(rTable, 8).Formula = .Item("Контакт")
Sheets("таблица").Cells(rTable, 9).Formula = .Item("Телефон")
Sheets("таблица").Cells(rTable, 10).Formula = .Item("E-mail")

'Перенос  Кп на лист
Sheets("КП (комплект)").Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).UsedRange.Value = Sheets(Sheets.Count).UsedRange.Value
Sheets(Sheets.Count).Name = .Item("Номер")
'удаление кнопки
ActiveSheet.Shapes.Range(Array("Button 1")).Select
Selection.Delete
Selection.Cut
      
'защита листа от изменений
ActiveSheet.Cells.Select
Selection.Locked = True
Selection.FormulaHidden = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

      
' Создание сметы отдельным файлом
ActiveSheet.Copy        'копирование листа в новую книгу
'Сохранение в нужной папке с нужным именем.
ActiveWorkbook.SaveAs "N:\MyDoc\11 КП\Сметы14\Смета на КП №" & Name & " " & Range("N19").Text & " " & Range("O19").Text & ".xls", FileFormat:=xlExcel8
ActiveWorkbook.Close

'Сохранение в ПДФ
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"N:\MyDoc\11 КП\Кп14\КП №" & Name & " " & Range("N19").Text & " " & Range("O19").Text & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:= _
True

ActiveWorkbook.SAVE

Sheets("КП (комплект)").Activate

End With

MsgBox "Записано"
Application.ScreenUpdating = True

End Sub
[/vba]

Автор - ilikeread
Дата добавления - 14.02.2014 в 13:10
ilikeread Дата: Пятница, 14.02.2014, 13:13 | Сообщение № 2
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
 
Ответить
СообщениеФайл на дропбоксе
https://www.dropbox.com/s/k0621lnpg38sfia/%D0%9A%D0%9F.xlsm

Автор - ilikeread
Дата добавления - 14.02.2014 в 13:13
Hugo Дата: Пятница, 14.02.2014, 13:31 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Файл качать не буду, но возможны такие варианты:
1. missing в references VBA
2. ошибка в ячейке.

Вообще эту кучу
[vba]
Код
If rCell.Value = ... Then
[/vba]
лучше заменить на одно извлечение значения ячейки в переменную и её проверка в select case - так будет быстрее.
Ещё быстрее делать на массиве.
И зачем там два раза
[vba]
Код
If rCell.Value = "Дата:" Then
[/vba]
?


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеФайл качать не буду, но возможны такие варианты:
1. missing в references VBA
2. ошибка в ячейке.

Вообще эту кучу
[vba]
Код
If rCell.Value = ... Then
[/vba]
лучше заменить на одно извлечение значения ячейки в переменную и её проверка в select case - так будет быстрее.
Ещё быстрее делать на массиве.
И зачем там два раза
[vba]
Код
If rCell.Value = "Дата:" Then
[/vba]
?

Автор - Hugo
Дата добавления - 14.02.2014 в 13:31
ilikeread Дата: Пятница, 14.02.2014, 16:15 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Hugo,
Спасибо за ответ, но это ничего не решает.

я не специалист в макросах, то что сделано, - сделано с помощью этого форума, где то люди подсказали, где то сам дошёл (выпилил кусок и вставил себе), где то макрорекордером писано.
Ваши варианты мне не дают информации о том как исправить ситуацию.
Повтор удалил, но ничего не изменилось.
Что может меняться в свойствах файла/листа /ячейки - что приводит к ошибке? на что обратить внимание? я же говорю что проблема может сама исчезнуть завтра например. или сегодня на xx открытие файла. и так же неожиданно снова проявиться. сегодня с утра всё работало, к обеду перестало.

Для примера, если я напишу вам "для исследования HeLa нужно использовать 40x-60х PH, а лучше DIC" - вы ведь не поймёте о чём речь.
Это я к тому что чайник не поймёт специалиста если он своей терминологией кидаться будет, вместо того чтобы объяснить.
 
Ответить
СообщениеHugo,
Спасибо за ответ, но это ничего не решает.

я не специалист в макросах, то что сделано, - сделано с помощью этого форума, где то люди подсказали, где то сам дошёл (выпилил кусок и вставил себе), где то макрорекордером писано.
Ваши варианты мне не дают информации о том как исправить ситуацию.
Повтор удалил, но ничего не изменилось.
Что может меняться в свойствах файла/листа /ячейки - что приводит к ошибке? на что обратить внимание? я же говорю что проблема может сама исчезнуть завтра например. или сегодня на xx открытие файла. и так же неожиданно снова проявиться. сегодня с утра всё работало, к обеду перестало.

Для примера, если я напишу вам "для исследования HeLa нужно использовать 40x-60х PH, а лучше DIC" - вы ведь не поймёте о чём речь.
Это я к тому что чайник не поймёт специалиста если он своей терминологией кидаться будет, вместо того чтобы объяснить.

Автор - ilikeread
Дата добавления - 14.02.2014 в 16:15
nilem Дата: Пятница, 14.02.2014, 16:47 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
ilikeread,
если формула в ячейке (rCell) возвращает ошибку, то If rCell.Value = "Дата:" Then приводит к ошибке Тype mismatch
Или поправьте формулы (ЕСЛИОШИБКА, например), чтобы не было #Н/Д, #Знач и пр. или добавьте в код проверку If Not IsError(rCell) Then примерно так:
[vba]
Код
For Each rCell In rRange
         If Not IsError(rCell) Then
             If rCell.Value = "Дата:" Then
                 .Add Key:="äàòà", Item:=rCell.Offset(0, 1).Value
             End If
             ...
        End If
  Next
[/vba]
Лучше бы, конечно, переписать весь код.


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеilikeread,
если формула в ячейке (rCell) возвращает ошибку, то If rCell.Value = "Дата:" Then приводит к ошибке Тype mismatch
Или поправьте формулы (ЕСЛИОШИБКА, например), чтобы не было #Н/Д, #Знач и пр. или добавьте в код проверку If Not IsError(rCell) Then примерно так:
[vba]
Код
For Each rCell In rRange
         If Not IsError(rCell) Then
             If rCell.Value = "Дата:" Then
                 .Add Key:="äàòà", Item:=rCell.Offset(0, 1).Value
             End If
             ...
        End If
  Next
[/vba]
Лучше бы, конечно, переписать весь код.

Автор - nilem
Дата добавления - 14.02.2014 в 16:47
ilikeread Дата: Пятница, 14.02.2014, 17:15 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
nilem,
Спасибо помогло " If Not IsError(rCell) Then"

переписать конечно наверно хорошо, НО я ж не специалист , тут строки вымученные :), я почти каждую понимаю что делает.
для переписывания нужно учить мат часть, , а у меня и без этого головняков хватает. формулами и макросами просто пытаюсь рабпроцесс оптимизировать.

Ещё раз спасибо.
 
Ответить
Сообщениеnilem,
Спасибо помогло " If Not IsError(rCell) Then"

переписать конечно наверно хорошо, НО я ж не специалист , тут строки вымученные :), я почти каждую понимаю что делает.
для переписывания нужно учить мат часть, , а у меня и без этого головняков хватает. формулами и макросами просто пытаюсь рабпроцесс оптимизировать.

Ещё раз спасибо.

Автор - ilikeread
Дата добавления - 14.02.2014 в 17:15
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!