Далее следует условная конструкция которая спрашивает, что делать если значение в str1(0) = "Vasua". Но почему то конструкция не считает что значение взятое из массива равно Текстовому значению По всей видимости есть некоторый нюанс, который необходимо знать при работе с текстовыми массивами берущими значения из текстовых файлов.
Непосредственно вариант кода:
Код
Sub Obrabotka()
Dim str1() As String
Dim PathFileName$
File_Strok_Poiska = "C:\Тест.txt"
str1 = Split(CreateObject("Scripting.FileSystemObject").Getfile(File_Strok_Poiska).OpenasTextStream(1).ReadAll, vbLf) 'Данный текстовый файл заносится в строковый массив построчно функцией Split
If str1(0) = "Vasua" Then
MsgBox 1
End If
Stop
End Sub
Прошу у Вас уточнения, возможно ли программным способом отключить Условное Форматирование на листе? По крайней мере в Excel 2010 есть возможность отключить УФ через удаление правил. Я хотел записать код через Макрорекодер но на выходе получился пустой макрос. Подскажите есть ли вообще способ отключения УФ на листе через VBA?
Прошу прощения у Модераторов и Старожилов форума за то что нет примера, насколько я понимаю примером в данном случае будет служить пустой файл.
Позвольте у Вас уточнить каким именно образом следует обращаться к определенному столбу многомерного массива? Я посчитал, что подобную задачу можно выполнить следующим образом:
Код
Sub arr_Test()
Dim arr(), arr_mnogom()
Dim k As Integer
k = 73 ' контрольное значение
' ////// одномерный массив ////
arr = Range(Cells(2, 2), Cells(11, 2)) ' пополнение одномерного массива из диапазона
stroka_v_massive = Application.Match(k, arr()) ' Расположение в массиве
' ////// одномерный массив ////
arr_mnogom = Range(Cells(2, 7), Cells(11, 9)) ' пополнение многомерного массива из диапазона
stroka_v_massive = Application.Match(k, arr_mnogom()(, 3)) ' Расположение в массиве
End Sub
На строке:
Код
stroka_v_massive = Application.Match(k, arr_mnogom()(, 3)) ' Расположение в массиве
выходит ошибка Syntax Error. Что по все видимости говорит о несколько неверном моем понимании об обращении к третьему столбцу массива.
Вопроса будет два: 1) Возможно ли обращение к определенному столбцу массива? 2) Возможно ли без циклическим способом пополнить одномерный массив из многомерного?
Прошу прощения у модераторов, если Они посчитают, что вторая часть вопроса "Выходит за Рамки темы". Если подобный способ действительно существует это решит проблему. Но в любом случае если есть возможность непосредственно обратиться к определенному столбцу, то вторая часть вопроса уже не актуальна, но все равно познавательна.
Подскажите пожалуйста возможно ли для т.н. называемых квадратных скобок примение динамических диапазонов. Т.е. для примера. Строка:
Код
[I1] = 1
Позволит вывести в ячейку I1 значение равное 1. А существует ли метод который позволит склеить значение под динамический диапазон? Да признаю была тема: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=25765 Но к сожалению в ней я не обнаружил подходящего решения. Мои попытки склеить диапазон чуть ниже и в файле примера тоже:
Код
Sub Dinamic_Qvadrato_Scob()
'[I1] = 1
'["J1" & "1"] = 2 ' в Ячейке J1 находится "I"
'[J1 & 1] = 2
[J1 & "1"] = 2
End Sub
Все они к сожалению безрезультатны. Подскажите пожалуйста вообще возможно делать "склеивание" под динамические диапазоны? И если возможно и это не слишком трудозатратно подскажите пожалуйста каким именно образом это можно делать?
Спасибо Всем за ответы. Дисскусия привела довольно неожиданный поворот. 2 цикла так 2 цикла.
Код
Sub Test_Massib()
Dim a(), b1(), b2(), b3()
a = Range("S8:Y14")
Count = 0
For i = 1 To 7
For j = 1 To 7
If a(i, j) = 4 Then
MsgBox i
MsgBox j
End If
Next j
Next i
End Sub
Прошу прощения за первоначальный вопрос. Изначально я был уверен, что есть условно простой метод, который позволяет найти координату в массиве по условию. Благодарю Всех за дисскусию.
Позвольте у Вас уточнить как быть в следующем случае? Перебираю массива Методов For Each и хочу узнать по адрес и номер строки Массива по условию. Делаю я это следующим способом:
Код
Sub Test_Massib_1()
Dim myRow As Long
Dim a()
a = Range("S8:Y14")
Count = 0
For Each Element1 In a
If Element1 = 4 Then
'If Element1 = 4 Then myRow = Element1.Row
'C = Element1.Address
'Stop
Count = Count + 1
myRow = Element1.Row
MsgBox myRow
End If
Next
MsgBox Count
End Sub
На строке:
Код
myRow = Element1.Row
процедура уходит на 424 ошибку. Позвольте у Вас уточнить в чем кроется ошибка? Каким образом определить номер строки в массиве по условию. Это возможно, если делать перебор методом For Each?
Уважаемый Anchoret. Благодарю за ответ. В течении недели файл отлаживался В конкретно взятом файле, о котором идет речь в первом сообщении темы, запись кода впринципе отстутствовала.
Уважаемый vikttur. Благодарю за ответ. Поймите пожалуйста правильно. Файл в достаточной степени громоздкий по содержанию и по "количеству кода". Такое стало возникать во время отладки. Почему именно я понять не могу.
Добрый день Уважаемые эксперты. Может быть кто то сталкивался с подобной проблемой. При попытке в рабочем файле в редакторе VBE внести дополнительную строку возникает ошибка "Out of Memory". Я понимаю что ошибка сигнализирует о недостатке памяти. Но в решении проблем по этой ошибке, насколько я смог составить свое суждение, Подобные ошибки возникают все-таки при компиляции, а не при попытке внести в код дополнительную строку. Подобная ошибка возникает только в одном файле. Файл относительно небольшой по вместимости (5 МБ) но все равно, с точки зрения правил форума, выходит за уровень верхне-допустимой границы размещения. Так вот была у кого нибудь это ошибка именно при попытке добавить в код дополнительные строки?
Позвольте у Вас уточнить возможно ли заполнение массива из отфильтрованного диапазона, по технологии подобной следующей:
Код
A = Range("A2:A26").SpecialCells(xlCellTypeVisible)
В принципе массив заполняется, но только до наступления фильтра. В кратце о диапазоне(диапазон довольно прост, в нем есть числа 1 2 3 4 5, каждое повторяется по 5 раз. Фильтром исключено число 4. Вот мой вариант кода:
Код
Sub Popolnenie_Otfiltrovannym()
Dim A() As Variant
' Проверка копированием
Range("A2:A26").SpecialCells(xlCellTypeVisible).Copy
Range("H30").Select
ActiveSheet.Paste
' Проверка копированием
A = Range("A2:A26").SpecialCells(xlCellTypeVisible)[E30].Resize(UBound(A)).Value = A
End Sub
Копирование проходит правильно, а массив же заполняется только до наступления фильтра. В общем подскажите массив вообще возможно заполнять методом :
Код
.SpecialCells(xlCellTypeVisible)
Если без дополнительных манипуляций не возможно тогда: - или циклическое заполнение массива - или предварительное копирование в другое место с отключением фильтра( или копирование на другой лист) с заполнением массива - или помещение в массив всей базовой выборки с дальнейшей фильтрацией массива функцией Filter.
Благодарю Вас за ответ. Предложенное Вами решение к сожалению ищет последние заполненные на листе, а не в границах диапазона. Все равно Спасибо Вам большое.
Уважаемый Михаил Лебедев. Благодарю за наводку. обязательно изучу.
Еще раз Здравствуйте Уважаемые Эксперты. Подскажите возможно ли вообще в Диапазоне найти последний заполненный столбец? Не на листе а в диапазоне? Я заимствовал с одного схожего сайта конструкцию и на основе ее соорудил следующий код:
Код
Sub Posl_stroka()
Dim rF As Range
Dim lLastRow As Long, lLastCol As Long
Set rF = Range("A5:J16").Find("*", , xlValues, xlWhole, xlPrevious)
lLastRow = rF.Row 'последняя заполненная строка
lLastCol = rF.Column 'последний заполненный столбец
MsgBox lLastRow
MsgBox lLastCol
End Sub
По его итогу последней строкой оказалось 7, а столбцом 1. Хотя "Глазами" видно что последний заполненный столбец это 8, а строка 9. Складывается такое ощущение, что дальше 1 столбца предложенный выше вариант не анализировал. Прошу уточнить, возможно ли именно в диапазоне, т.е. в объекте Range(), найти последнюю заполненную строку и столбец? Если не возможно, то остаются только циклы?
Подскажите пожалуйста такой момент. Имеется два схожих между собой варианта заполнения диапазонов через VBA:
Код
Sub Proverka_Formula_Local()
Range("B3:B8").FormulaLocal = "=ЕСЛИ((RC[-1]-R[-1]C[-1])<=R2C5;0;RC[-1])" '1 случай
Range("B3:B8").FormulaLocal = "=ЕСЛИ((RC[-1]-R[-1]C[-1])<=R2C5;"";RC[-1])" '2 случай
End Sub
В первом случае в случае не выполнения условия в ячейку добавляется 0. Во втором случае пустота. Первый случай выполняется, второй уходит на ошибку 1004. Если вводить формулу из второго случая на листе, то она работает. А через VBA не почему то не хочет. Подскажите что нужно изменить или добавить, чтобы отработал второй случай?
Уважаемый Nordheim Благодарю Вас за ответ. Вы Правы, второй цикл не имеет вообще никакого назначения, он был для проверки правильности вывода. Спасибо за предложенное решение. Впредь буду более грамотно работать с массивами. Спасибо Вам.
Подскажите пожалуйста есть ли способ вывести на лист массив заполненный с помощью цикла, без циклическим способом? Вот пример небольшого кода:
Код
Sub Obmen_Massivami()
Dim Peremennaya_Massiva As Variant
Vsego_Elementov = 10
ReDim Peremennaya_Massiva(1 To Vsego_Elementov)
For i = 1 To Vsego_Elementov
Peremennaya_Massiva(i) = Cells(i, 1)
Next i
For i = 1 To Vsego_Elementov
Cells(i, 3) = Peremennaya_Massiva(i)
Next i
[E1].Resize(UBound(Peremennaya_Massiva)).Value = Peremennaya_Massiva
End Sub
Чтобы выводился весь заполненный первым циклом массив? А не только его Первое(Верхнее) значение. Т.е. еще раз, как вывести на лист массив, не циклическим способом, но при этом заполненным с помощью цикла? Или даже так, Есть объект Range(), к нему можно обратиться например так Range(Cells(1, 1), Cells(10, 1)), из этой записи понятно что объект Range обращается к диапазону (A1:A10), а как сделать подобное обращение в массиву и вывести на лист?
Подскажите пожалуйста такой момент. Если идет заполнение массива из диапазона взятого на листе по следующей технологии:
Код
Dim a As Variant
a = Range("A1:A10")
Подскажите в данном одномерном массиве возможно узнать что будет в значении a(5). Точнее так, можно ли узнать значение определенного места(например a(5)) массива, если при этом массив заполняется не циклическим способом?
Код
Sub Massiv_Diap()
Dim a As Variant
a = Range("A1:A10")
Cells(1, 3) = a(5)
End Sub
И на строке:
Код
Cells(1, 3) = a(5)
получил ошибку Subscrip out of range. Видимо не прав, или в синтаксисе или это вообще не возможно. Прошу прощения за название темы лучше пока не придумал.
Sub Maassive()
Dim A As Variant
Nom_grup = 3
ReDim A(1 To Nom_grup)
'A = Range("F4:G9")
'Range("I4:J9") = A
k = 3
m = 3
Shag_cikla2 = Nom_grup
Nom_grup = 0
For i = 1 To Shag_cikla2
k = k + 1
Nom_grup = Nom_grup + 1
'A(Nom_grup) = Range("F4:G5")
A(Nom_grup) = Range("F" & Cells(k, 3) & ":G" & Cells(k, 4))
Next i
Shag_cikla2 = Nom_grup
Nom_grup = 0
For i = 1 To Shag_cikla2
m = m + 1
Nom_grup = Nom_grup + 1
'Range("I4:J9") = A(Nom_grup)
Range("I" & Cells(m, 3) & ":J" & Cells(m, 4)) = A(Nom_grup)
Next i
End Sub