Новости:

Новая редакция правил форума: 2.4. Если вопрос или ответ содержится во вложенном файле, все-равно кратко описывайте в сообщении вопрос или суть решения. Это необходимо, чтобы тему можно было найти через поиск.

Главное меню

VBA не могу разобраться

Автор NooBasTiK, 11.07.2012, 10:26

« назад - далее »

NooBasTiK

Есть шаблон excel файла с большим кодом vba, я в нем переделываю форму которая должна заполняться, всё вроде хорошо но не вставляются куда надо названия разделов подразделов и т.п. вроде как нашел код который за это отвечает. Может кто то подсказать как его отредактировать что бы вставлял названия куда я захочу?

' Добавление на лист ЛС_* строк с заголовками
Function fillChap(ceAllNtns As Object, cmapNtns As Collection, nMaxRow As Long) As String
   fillChap = ""

   Dim indN As Long, nRow As Long, nChaps As Long
   Dim eNtn As Object
   Dim sNtnType As String, sCap As String, sNPP As String, sName As String
   Dim mapNtn As Dictionary
   nChaps = 0
   For indN = 1 To ceAllNtns.Length
       Set eNtn = ceAllNtns(indN - 1)
       sNtnType = getFld(eNtn, "ТИП", "?")
       If sNtnType = "<" Or sNtnType = "[" Or sNtnType = "{" Then
           sNPP = getFld(eNtn, "НПП")
           sName = getFld(eNtn, "ИМЯ")
           sCap = IIf(sNtnType = "[", "Раздел", IIf(sNtnType = "{", "Подраздел", "Глава"))
           If indN - nChaps <= cmapNtns.Count Then
               ' Вставим раздел перед следующей расценкой
               Set mapNtn = cmapNtns(indN - nChaps)
               nRow = mapNtn("firstLSRow") + nChaps
           Else
               ' Пропускаем разделы за последней расценкой
               Exit For
               ' Вставим раздел после последней расценки/раздела
           '   Set mapNtn = cmapNtns(cmapNtns.Count)
           '   nRow = 1 + mapNtn("firstLSRow") + nChaps      ' ?b?
           End If
       
           Range("A" + CStr(nRow)).Select
           Selection.EntireRow.Insert
           Range("A" + CStr(nRow) + ":L" + CStr(nRow)).Formula = Array(sNPP, sCap, sName, "", "", "", "", "", "", "", "", "")
           Range("A" + CStr(nRow) + ":L" + CStr(nRow)).Style = "LsChapter"
           
           nChaps = nChaps + 1
       End If
   Next
   nMaxRow = nMaxRow + nChaps
End Function

NooBasTiK

Никто не понял этот код? :)

kuklp

#2
Цитироватьно не вставляются куда надо ... что бы вставлял названия куда я захочу?
NooBasTiK, у Вас 87 взлетов в форуме на текущий момент. Вы и вправду искренне считаете, что по такому описанию все должны тут же понять "куда надо" и "куда я захочу"? Это только первый нюанс. Дальше, по Вашему описанию, желающие помочь Вам должны сами создать файл, в нем форму, заполнить его(файл) незнамо какими данными и т.д., чтоб подогнать макрос под(угаданные, опять же) Ваши хотелки?
Не сочтите за труд ознакомиться с правилами форума. Пока модераторы не употребили власть:-)
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

NooBasTiK

боюсь если я буду писать всё более подробно то станет еще не понятнее, я просил может кто понимает что делает этот код. Как я понял он вставляет строки разделов подразделов и т.д., мне нужно что бы он вставлял это не туда куда он сейчас вставляет.

Шпец Докапыч

Чтобы вставлял куда надо, следует изменить условие:
If sNtnType = "<" Or sNtnType = "[" Or sNtnType = "{" Then
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли

NooBasTiK

Цитата: Шпец Докапыч от 11.07.2012, 18:21
Чтобы вставлял куда надо, следует изменить условие:
If sNtnType = "<" Or sNtnType = "[" Or sNtnType = "{" Then
А можно по подробнее? как это правило действует?

GWolf

Цитата: NooBasTiK от 11.07.2012, 23:07
...
А можно по подробнее? как это правило действует?

;D ;D ;D :'( - СМЕЯЛСЯ ДО СЛЕЗ!

А если по существу, то:
1) Ув. KukIP правильно указал Вам направление и стиль поведения на данном форуме. Вы же, только без обид, решили уподобится водителю на толстом джипе: "Ну и фиг на правила, сматри кака крута тачанка!".
2) Шпец Докапыч, честно говоря, я стесняюсь в присутствии этого человека шляпу одеть! Но все же замечу Вам, что он таки верно указал какая часть кода рулит в ответе на Ваш вопрос. Но ...
Уважаемый NooBasTiK, если Вы, как Вы говорите, что-то меняете в кем то написаном проекте, то полагаю, основами VBA владеете!?
Тогда может быть сами поймете, что, для ответа на Ваш вопрос в выше приведенной цитате, следует ПРОЧИТАТЬ и ПОНЯТЬ
ЦитироватьsNtnType = getFld(eNtn, "ТИП", "?")
        If sNtnType = "<" Or sNtnType = "[" Or sNtnType = "{" Then
вот эти строки кода. А поняв их, нетрудно сделать вывод, что getFld функция пользовательская, и на тему
Цитироватьпоподробнее
ее бы тоже неплохо опубликовать.

Прошу прощения, ничего личного. Но, стоит задуматься ...
С ув. GWolf.
Путей к вершине - множество. Этот один из многих!

NooBasTiK

#7
Если я буду выкладывать тут всё что связанно с этим кодом то на сервере закончиться место! Всё равно спасибо и в VBA я не петрю, иначе бы сюда не обращался. Автор кода говорит что консультации не даёт вот и приходиться заниматься методом научного тыка.
Функция gtFild
Function getFld(eFldsParent As Object, sName As String, Optional sDefVal As String = "") As String
    Dim eFld As Object
    Set eFld = eFldsParent.selectSingleNode("fld[ @name='" + sName + "']")
    If eFld Is Nothing Then
        getFld = sDefVal
    Else
        getFld = eFld.Text
    End If
End Function

GWolf

Цитата: NooBasTiK от 12.07.2012, 10:29
Если я буду выкладывать тут всё что связанно с этим кодом то на сервере закончиться место! Всё равно спасибо и в VBA я не петрю, иначе бы сюда не обращался. Автор кода говорит что консультации не даёт вот и приходиться заниматься методом научного тыка.

"Вам шашечьки, или ехать?" Если переживаете за место на сервере, то выложите на файлообменнике. Нам, вроде как и не очень критично то, что Вы не решите Ваш вопрос, но, если Вы в его решении заинтересованы, то, думается, найдете адекватный способ передать информацию для форума, в количестве, необходимом для решения задачи.

Успеха!
Путей к вершине - множество. Этот один из многих!

NooBasTiK

Я все нашел, в этом коде за то где будет находиться разделы и т.п. отвечает
Range("A" + CStr(nRow)).Select
            Selection.EntireRow.Insert
            Range("A" + CStr(nRow) + ":L" + CStr(nRow)).Formula = Array(sNPP, sCap, sName, "", "", "", "", "", "", "", "", "")
            Range("A" + CStr(nRow) + ":L" + CStr(nRow)).Style = "LsChapter"