Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 3)

Автор: Undaster
Дата сообщения: 14.04.2011 15:51
andrewkard1980, про InStr Вам уже сказали, единственное замечу, что для такой работы лучше регулярных выражений не придумали ещё ничего
Автор: andrewkard1980
Дата сообщения: 14.04.2011 16:02

Спасибо.
InStr не годится, потому что он привязывается к символу "/" и повторению, то например с первой строки число перед третим слешем будет 49, в второй - 48, в третей - л, что не есть хорошо. Я подразумевал поиск именно /**/ и уже от него плясать. Например в Excel я использую формулу:
=MID(G14;FIND(" ";G14;SEARCH("/??/";G14;1)-6);SEARCH("/??/";G14;1)-FIND(" ";G14;SEARCH("/??/";G14;1)-6))

Undaster

На счет регулярных выражений, надо с ними разбиратся. Буду пробывать.
Автор: Undaster
Дата сообщения: 14.04.2011 16:30
andrewkard1980, рекомендую RegexBuddy в качестве конструктора регулярных выражений — голову не заменяет, но жизнь сильно упрощает.
Автор: andrewkard1980
Дата сообщения: 14.04.2011 23:23
Undaster
интересная штука, но мне надо в макросе.

asbo
А функция InStr может иметь вид как SEARCH("/??/";G14;1)? Под знаками вопроса - любые числа.
Автор: AndVGri
Дата сообщения: 15.04.2011 01:56
KolyaP
Может на Планета Excel? Там и народу больше тусутется
andrewkard1980
А кто мешает пользоваться функциями Excel в VBA? Через

Код:
Dim xlFuncs As WorksheetFunction
Dim sValue As String, sResult As String
Set xlFuncs = Application.WorksheetFunction
sValue = Range("G14").Value
'sResult = Mid$(sValue, xlFuncs.Find(" ", sValue ......
Автор: SAS888
Дата сообщения: 15.04.2011 07:16
Т.е. требуется обнаружить конструкцию, типа "??/??/??" и получить первое в ней число?
Можно, например, так:

Код: s = "Ахматової серія КТУ, 19/25кер/бет, 49/19/12, стяжка, с/в сумісний, балкон, розвинена інфраструктура, 80000у.о., код 2130"
On Error Resume Next
MsgBox Split(Mid$(s, Application.Search("??/??/??", s)), "/")(0)
Автор: andrewkard1980
Дата сообщения: 15.04.2011 09:46
SAS888
Отличное решение, я не встречал еще Application.Search. Возьму на вооружение.
Спасибо.

Добавлено:
SAS888
Сделал код в таком ввиде:
z19 = Application.Search("??/??/??", z16)
z20 = Application.Search("??/????/??", z16)

If IsNumeric(z19) Then z21 = z19 Else z21 = z20
If IsError(z21) = True Then z22 = "" Else z22 = Split(Mid$(z16, z21), "/")(0)

If z22 < 1 Then z23 = Split(Mid$(z16, z21 - 3), "/")(0) Else z23 = z22

Таким образом получается вытянуть значения типа
57/25/14
46/18.2/13.2
46.6/18.2/
Т.е. практически все возможные, что есть хорошо
Если не делать проверку на Error, при ошибке ставит предидущее значение.
Еще раз спасибо за подсказку SAS888
Автор: greendeem
Дата сообщения: 15.04.2011 12:47
Помогите выделить столбцы с определенным именем.
Необходимо макросом скопировать на отдельный лист столбцы с определенными именами…
Имена столбцов в первой строке... , пробовал через Range с указанием имени столбца – нифига не вышло. В VBA далеко не силантий.
Заранее спасибо.
Автор: andrewkard1980
Дата сообщения: 15.04.2011 14:11
Columns("E:M").Select
Автор: SAS888
Дата сообщения: 16.04.2011 05:38

Цитата:
пробовал через Range с указанием имени столбца – нифига не вышло.

Почему? Вот варианты:

Код: Range("E:M").Select
[E:M].Select
Columns("E:M").Select
Автор: greendeem
Дата сообщения: 18.04.2011 13:17
В том-то и есть трудность: номера столбцов, необходимые для копирования не известны. Определить их нужно по имени. (К примеру необходимо копировать столбцы с именем "/ESADout_CU:ESADout_CUGoodsShipment/ESADout_CU:ESADout_CUGoods/#id", "/ESADout_CU:ESADout_CUGoodsShipment/ESADout_CU:ESADout_CUGoods/catESAD_cu:CustomsCost" и т.д.). Имена столбцов известны.
Автор: ZlydenGL
Дата сообщения: 18.04.2011 13:36
Ну тогда так?

Код: Dim Col as Byte
For Col = 1 To Cells.SpecialCells(xlCellTypeLastCell).Column
If Cells(Col) Like "*точтоищем*" Then
Columns(Col).Copy
Destination.Paste
End If
Next Col
Автор: JekaKot
Дата сообщения: 19.04.2011 18:36
Прошу помочь с задачкой: нужно несколько txt-файлов (таблицы) вставить последовательно в один документ Excel.
Нашел в сети вот это

Код: SUB Макрос1()
b = Dir("*.TXT")
i = 1
WHILE b <> ""
With Selection
.InsertFile FileName:=b, ConfirmConversions:=False
.InsertParagraphAfter
.Collapse Direction:=wdCollapseEnd
END With
i = i + 1
b = Dir()
IF i MOD 2 = 0 THEN
Selection.InsertBreak TYPE:=wdSectionBreakNextPage
END IF
WEND


END SUB
Автор: andrewkard1980
Дата сообщения: 19.04.2011 23:16
Добрый вечер, коллеги.
Столкнулся со сложностью,
есть html страничка в виде:
http://www.n.com/index.php?id=40&file=01.txt ' Пример
открывается как обычный сайт, но процедура не работает, подскажите как видоизменить?

код:
sURI = "http://www.n.com/index.php?id=40&file=01.txt"
Set oHttp = CreateObject("MSXML2.XMLHTTP")
If Err.Number <> 0 Then
Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
End If
On Error GoTo 0
If oHttp Is Nothing Then
Exit Sub
End If
oHttp.Open "GET", sURI, False
oHttp.Send
htmlcode = oHttp.responseText

Добавлено:
Поспешил с вопросом. Нашел, спасибо. Решение вот:
Set IE = CreateObject("InternetExplorer.Application"):
On Error Resume Next
addr$ = "http://www.......file=01.txt"
IE.Navigate addr$
While IE.busy Or (IE.readyState <> 4): DoEvents: Wend
txt$ = IE.Document.body.innerText
z = txt$
Автор: greendeem
Дата сообщения: 21.04.2011 09:51
ZlydenGL
о! буду пробовать!
Автор: oshizelly
Дата сообщения: 21.04.2011 14:45
Если в текстовых ячейках помимо основного текста имеется краткий комментарий, заключенный в квадратные (или любые другие) скобки, то можно ли как-то удалить эти комментарии из всей колонки? Текст комментариев, естественно, в каждой ячейке разный.
Простая, на первый взгляд, задачка, но, похоже, стандартными средствами макрозамены не решается.
Спасибо!

Автор: ZlydenGL
Дата сообщения: 21.04.2011 14:58
Если без регекспа, то можно так:

Код: If Instr(1, Cells(I,J), "(", vbTextCompare)>0 Then
RemoveComment(Cells(I,J), "(")
ElseIf Instr(1, Cells(I,J), "[", vbTextCompare)>0 Then
RemoveComment(Cells(I,J), "[")
ElseIf Instr(1, Cells(I,J), "{", vbTextCompare)>0 Then
RemoveComment(Cells(I,J), "{")
End If

Private Function RemoveComment(MyStr As String, Start_Symbol as String) As String
Dim Start As long, Finish As Long
Start = Instr(1, MyStr, Start_Symbol, vbTextCompare)
If Start_Symbol = "(" Then
Finish = Instr(Start + 1, MyStr, ")", vbTextCompare)
Else
Finish = Instr(Start + 1, MyStr, Chr(Asc(Start_Symbol)+2), vbTextCompare)
End If
If Finish > Start Then
RemoveComment = Left(MyStr, Start-1) & right(MyStr, Len(MyStr) - Finish + 1)
Else
RemoveComment = MyStr
End If
End Function
Автор: oshizelly
Дата сообщения: 21.04.2011 18:00
ZlydenGL
Я жутко извиняюсь, но в описании задачи я неправильно использовал одно слово, что привело к полному искажению смысла просьбы. Поучительный пример, что выражаться надо точно.
Дело в том, что под "комментарием" я имел в виду не комментарий в специфическом смысле MS Excel, а просто обычный текст, который по смыслу является комментарием к основному тексту ячейки. Например, так:

Код: яблоки красные [у бабы Дуси не покупать!]
груши гнилые [опасно для здоровья!]
Автор: ZlydenGL
Дата сообщения: 21.04.2011 19:25
oshizelly, все правильно, мой код с такими записями и работает Коллекцию Comments() вообще не использую.

Только отладить не забудь - у меня так руки и не дошли этот код в VBA вставить да посмотреть на результат.
Автор: aidomars
Дата сообщения: 22.04.2011 11:10
Может было, но напишу.
Добавил на панель кнопку, которая включает/убирает автофильтр в активной строке.

Код: Sub Автофильтр()
r = ActiveCell.Row
If Not ActiveSheet.AutoFilter Is Nothing Then
ActiveSheet.Cells.AutoFilter
Else
ActiveSheet.Range(Cells(r, 1), Cells(r, 100)).AutoFilter
End If
End Sub
Автор: Clancher
Дата сообщения: 22.04.2011 13:06
В общем есть такой вопрос как из под Excel найти, запиcать в массив для последующей обработки заголовки всех окон имеющихся в диспечере задач. Я имею в виду те заголовки, что используются в Findwindow для получения hwnd. Сорри если просмотрел решение, заранее спасибо.
Автор: korol26
Дата сообщения: 22.04.2011 14:08
Ребят, может быть, такой вопрос уже был, но я не нашёл решения...

Задача следующая:

Есть табличка в следующем виде:

---------------------
Номер процесса
---------------------
Номер шага процесса
---------------------
Учатник процесса
---------------------

Необходимо написать макрос, который может автоматически переделывать табличку в следующий формат:
|Номер процесса|Номер шага процесса|Учатник процесса|
| | | |

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

Заранее огромное спасибо!
Автор: aidomars
Дата сообщения: 22.04.2011 14:31
korol26
а если транспонировать, оно не?
Автор: asbo
Дата сообщения: 22.04.2011 14:47
korol26,
Стандартная функция "Копировать", "Специальная вставка" с галкой транспонировать. Если конечно акцент на этом, а не на "написать макрос"
Макрос вот. Он автоматом пишется:

Код: Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 2011-04-22 (***)
'

'
Range("B4:D10").Select
Selection.Copy
Range("F4").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
End Sub
Автор: aidomars
Дата сообщения: 22.04.2011 19:56
asbo
Ну таки файлы надо, смотреть надо, что и как куда.
Автор: black_dron
Дата сообщения: 29.04.2011 21:31
Народ помогите плиз решить задачу в Excel с помощью VBA.
Условие задачи: При изменение ячеек, где вводятся цифры, должна строится шахматная доска ограниченная размером. Размер шахм. доски состоит из строк и столбцов.

Пример как должно выглядеть, на картинке ниже:

http://img10.imageshack.us/i/86495243.jpg

Заранее спасибо)))
Автор: asbo
Дата сообщения: 29.04.2011 22:38
black_dron, дык, помочь-то несложно. А что не получается?
Автор: smirnvlad
Дата сообщения: 30.04.2011 12:58
black_dron

Цитата:
ри изменение ячеек, где вводятся цифры, должна строится шахматная доска ограниченная размером. Размер шахм. доски состоит из строк и столбцов.

[more]
размер в третьей строке первая вторая ячейки

Код: [no]
Private Sub Worksheet_Change(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone
On Error GoTo E
For c = 1 To Cells(3, 1).Value
For r = 1 To Cells(3, 2).Value
If (c + r) Mod 2 = 0 Then
With Range(Cells(r * 2 - 1, c * 2 - 1), Cells(r * 2, c * 2)).Interior
.ColorIndex = 1
.Pattern = xlSolid
End With
End If
Next
Next
Exit Sub
E:
MsgBox ("Введено неправильное число")
End Sub
[/no]
Автор: black_dron
Дата сообщения: 30.04.2011 16:55
smirnvlad спасибо большое, все работает)))
Автор: phoenix72rus
Дата сообщения: 03.05.2011 21:41
Ребят подскажите пожалуйста, столкнулся с такой проблемой, есть экселевский документ с кодом VBA (написанный еще в 98 году). При открывании документа должно появлятся досовское окно (программа) с менюшкой вверху и исходными данными, которые хранятся в этом экселевском файле.
При попытке открыть на 7 винде выдает ошибку доступа или недоступности сервера и открывать отказывается.
На Хрюше выдает ошибку, что файл очень сильно поврежден, восстанавливает, пишет очень сильно поврежден и восстановить мало что удалось, в итоге показывает только исходные данные (тыкаю льт+ф11, чтобы глянуть код там везде все пусто). Т.е. не может восстановить сам код.
На Хрюше и через ОпенОфис открывает тоже только исходные данные (но не матерится и не предлагает ничего восстанавливать).

Прикол в чем, пробовал на 7 разных компах открыть, результат 0, попробовал еще на одном, открылось все с пол пинка (открыли в 03 офисе), прекрасно работает... Что у мя не так? х_х
стоит Хрюша, стоит офис (пробовал как 07, так и 03), подумываю на библиотеки VB, может из за них такое быть? Или мб у кого еще идеи есть, если надо могу сам файл скинуть.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.