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

» Excel VBA (часть 3)

Автор: Sale525
Дата сообщения: 21.12.2010 16:45
mcdie>, спасибо, буду пробовать!
Автор: vaulin
Дата сообщения: 22.12.2010 08:17

Цитата:
mcdie, спасибо за отклик!

"Затык" продолжается. Все глохнет на этом:


Цитата:
ActiveWorkbook.SaveAs Filename:=ActiveWorkbook.Path & "\" & iBaseName & ".dbf", _
FileFormat:=xlDBF4, CreateBackup:=False


Вываливается Run-time error "1004"

Sale525, а ты библиотеку Scripting Runtime подключил в твоем проекте? т.к. ты используешь FSO: "iBaseName = CreateObject("Scripting.FileSystemObject").GetBaseName(AFile_Name) " Может в этом дело?
Автор: KF121
Дата сообщения: 22.12.2010 08:49
Господа,
есть экселевский файлик в нем есть несколько VBA модулей, классов, форм, как автоматически изменить содержимое этих модулей модулей, классов, форм на другие которые бурутся из других файлов, важен именно сам механизм как из вне добраться до содержимого vba проекта в xls файле.
Подскажите пожвлуйста

Добавлено:
ответ найден, все делается через
With ThisWorkbook.VBProject.VBComponents
.Remove .Item("Module1")
.Import Path & "CommonUtils"
End With
Автор: vaulin
Дата сообщения: 22.12.2010 11:37
Нашел интересную возможность использования преобразования Фурье (БПФ) в VBA Excel [Ссылка]! для этого в рабочей книге Excel необходимо подключить пакет анализа (в 2007: главная кнопка -- параметры Excel – надстройки – управление -- параметры Excel – перейти – пакет анализа) и далее в проекте VBA подключить этот пакет (Tools – References – atpvbaen.xls), и при наборе кода в качестве функции писать, например, “Result = [atpvbaen.xls]. ” в появившемся всплывающем списке выбирать нужную функцию. Например, функция [atpvbaen.xls].Fourier(inputRng, outputRng) осуществляет БПФ. Можно делать БПФ в VBA по-другому [Ссылка]:
Sub SmallDemo()
Const FFT As String = "ATPVBAEN.XLA!Fourier"
Const Forward As Boolean = False

Run FFT, [A1:A8], [B1], Forward
End Sub

:>)
--
Dana DeLouis
Win XP & Office 2003

Удачи!
Автор: DmitriyNVartovsk
Дата сообщения: 22.12.2010 14:13
Здравствуйте.
Помогите пожалуйста решить вопрос.

В на листе есть две таблицы:
Таблица 1.
№ 1 2 3 4
Автор: mcdie
Дата сообщения: 23.12.2010 12:30
DmitriyNVartovsk
Посмотри тут, я так понял что тебе нужно было через формулы сделать.
Ячейка А1- ввод номера человека
Ячейка D1 - результат в виде коэффициента
[Ссылка]
Автор: chupakabara
Дата сообщения: 24.12.2010 15:15
привет , помогите пожалуйста сделать макрос.
Есть список данных для выполнения циклической инвентаризации
Допустим это
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
f13
f14
f15
f16
f17
f18
f19
f20
f21
Каждый день , человек при запуске макроса должен получать результат:
3 рандомные ячейки должны копироваться на другой лист
при чем каждый день в течении недели , должны браться всегда разные 3 ячейки и они не должны повторятся в течении недели.
Т.е. при каждом запуске макроса должны копироваться 3 рандомные ячейки не совпадающие с предыдущими .
типа
Понедельник:
f1
f15
f20
Вторник:
f3
f9
f2
и т.д.

Возможно ли такое ?
Заранее спасибо.
Автор: SAS888
Дата сообщения: 24.12.2010 18:42
DmitriyNVartovsk

Цитата:
Необходимо из певой таблицы взять данные о поле и возрасте и сравнить со второй таблицей и определить соответствующий коэффициент.
В каких диапазонах расположены таблицы? Куда помещать результат?
Автор: AndVGri
Дата сообщения: 25.12.2010 05:14
chupakabara
Можно
Во вспомогательном файле хранишь номер Weekday(Now) дня недели
В другом вспомогательном файле номера строк, уже выбранных на этой неделе, если первый день недели (новая неделя), то сбрасываешь список уже выбранных.
Остальные, не входящие в список уже использовавшихся (можно использовать Dictionary для удобства), грузишь в Collection и выбираешь случайно по индексу с удалением из коллекции выбранного и записью в файл уже использовавшихся. По числу записей в файле и номеру дня недели определяешь, не запустили ли макрос повторно.
Вспомогательные файлы можно заменить рабочим листом (скрытым от пользователя), могут и другие варианты быть, например, реестр
Автор: chupakabara
Дата сообщения: 25.12.2010 08:23

Цитата:
chupakabara
Можно
Во вспомогательном файле хранишь номер Weekday(Now) дня недели
В другом вспомогательном файле номера строк, уже выбранных на этой неделе, если первый день недели (новая неделя), то сбрасываешь список уже выбранных.
Остальные, не входящие в список уже использовавшихся (можно использовать Dictionary для удобства), грузишь в Collection и выбираешь случайно по индексу с удалением из коллекции выбранного и записью в файл уже использовавшихся. По числу записей в файле и номеру дня недели определяешь, не запустили ли макрос повторно.
Вспомогательные файлы можно заменить рабочим листом (скрытым от пользователя), могут и другие варианты быть, например, реестр

я не сильно разбираюсь в макросах, поэтому не совсем понял как это сделать.
Ячеек из которых нужно будет выбирать 70 тысяч.
Может мы можем списаться в icq или по почте ? Помогите написать макро, пожалуйста . очень нада .
Автор: KolyaP
Дата сообщения: 25.12.2010 14:19
Подскажите можно передать текстовое содержимое буфера обмена в переменную типа Variant VBA, а не на лист книги. Если да, как это сделать?
Автор: marin4ik047
Дата сообщения: 26.12.2010 15:31
Добрый день. у меня есть задание, хотелабы обратиться за помощью. -Задание- Создать таблицу имен и фамилий в дательном падеже... у меня есть в именительном, а теперь надо в дательный. каким образом, спасибо.
Автор: AndVGri
Дата сообщения: 27.12.2010 01:44
KolyaP

Код:
Dim p As New DataObject
p.GetFromClipboard
Debug.Print p.GetText(1)
Автор: chupakabara
Дата сообщения: 27.12.2010 08:16

Цитата:
привет , помогите пожалуйста сделать макрос.
Есть список данных для выполнения циклической инвентаризации
Допустим это
f1
f2
f3
f4
f5
f6
f7
f8
f9
f10
f11
f12
f13
f14
f15
f16
f17
f18
f19
f20
f21
Каждый день , человек при запуске макроса должен получать результат:
3 рандомные ячейки должны копироваться на другой лист
при чем каждый день в течении недели , должны браться всегда разные 3 ячейки и они не должны повторятся в течении недели.
Т.е. при каждом запуске макроса должны копироваться 3 рандомные ячейки не совпадающие с предыдущими .
типа
Понедельник:
f1
f15
f20
Вторник:
f3
f9
f2
и т.д.

Возможно ли такое ?
Заранее спасибо.



Может кто помочь ? ооочень нада , пожалуйста.
Автор: summnx
Дата сообщения: 27.12.2010 15:14
С программированием не сильно дружу, помогите плиз в написании макроса (уверен, тут пару строчек).
Нужно взять 1-ый столбец, бесконечно длинный, и вычислить сумму каждой пятой его ячейки друг с другом и вывести эту сумму в ячейку другого столбца.
Заранее огромное спасибо.
Автор: ZlydenGL
Дата сообщения: 27.12.2010 16:00
summnx, бесконечно длинного не получится, максимум 65535 ячеек для Excel версии до 2007 Да и после ИМХО какое-то ограничение есть.

Способов на самом деле два:
1. Макрос

Код: Dim I as Long, Summ as Double
For I = 1 To Cells.SpecialCells(xlLastCell).Row Step 5
Summ = Summ + Cells(I, 1)
Next I
Cells(1,2) = Summ
Автор: KolyaP
Дата сообщения: 27.12.2010 17:54

Цитата:
KolyaP

Код:
Dim p As New DataObject
p.GetFromClipboard
Debug.Print p.GetText(1)

Спасибо! Уже нашёл этот способ.
Единственное примечание. Нужно сделать ещё такую процедуру:
через меню редактора макросов Tools -> References -> поставить галку напротив Microsoft Forms 2.0 Object Library
Автор: summnx
Дата сообщения: 28.12.2010 10:16
ZlydenGL

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

Код:
Sub ggg()
Dim I As Long, Summ As Double, sred As Double
sred = 0
For I = 1 To Cells.SpecialCells(xlLastCell).Row Step 5
Summ = Summ + Cells(I, 1)
sred = sred + 1
Next I
Cells(1, 2) = Summ / sred
End Sub

Автор: mcdie
Дата сообщения: 28.12.2010 14:55
summnx
xlLastCell - указывает на последнюю заполненную ячейку листа, а не на последнюю ячейку листа. Среднее значение в твоём случае будет завышено. Дели не на sred
а на 65535/5
Автор: 3x3r
Дата сообщения: 28.12.2010 16:14
Необходимо создать цикл Repeat until в excel, прикрепленный к определенным ячейкам, через макрос.
Помогите написать программный код.
Автор: mcdie
Дата сообщения: 28.12.2010 17:02
chupakabara
Лист1: заполняем ячейки A1-A21 значениями f1-f21
Пример:
Лист2: Результат выполнения A2:G4 (столбцы - дни недели) - в текущий день недели будут копироваться 3 случайных неповторяющихся числа из Листа1 + сохранение книги.
Реализовано через сохранение данных во временные массивы.
[more]

Код:
*/
Dim DayOfW As Integer
DayOfW = Weekday(Now, vbMonday)
Dim I, J, D As Integer
Dim ArrB(1 To 3, 1 To 7) As String
Dim ArrA(1 To 21) As String
Dim ArrS(1 To 21) As Boolean
Dim ACount As Integer
Dim ARND As Integer
'сохранение во временные массивы
For J = 1 To 21
ArrA(J) = Sheets("Лист1").Cells(J, 1)
ArrS(J) = False
Next J
For D = 1 To 7
For I = 1 To 3
ArrB(I, D) = Sheets("Лист2").Cells(I + 1, D)
Next I
Next D
ACount = 0
'расчёт повторяющихся значений
For J = 1 To 21
For D = 1 To 21
A1 = (D - 1) Mod 3 + 1
A2 = (D - 1) \ 3 + 1
If ArrA(J) = ArrB(A1, A2) Then
ArrS(J) = True
ACount = ACount + 1
Exit For
End If
Next D
Next J
ACount = 21 - ACount
'расчёт случайного значения по дню недели
For J = 1 To 3
S = ""
ARND = Int((ACount * Rnd) + 1)
For I = 1 To 21
If ArrS(I) = True Then
ARND = ARND + 1
ElseIf ARND = I Then
S = ArrA(I)
ArrS(I) = True
ACount = ACount - 1
End If
Next I
ArrB(J, DayOfW) = S
Next J
'вставка расчётных значений на Лист2
For D = 1 To 7
For I = 1 To 3
Sheets("Лист2").Cells(I + 1, D) = ArrB(I, D)
Next I
Next D
' + сохранение можно добавить чтобы данные о выполненном макросе сохранялись на Листе
ActiveWorkbook.Save
*/
Автор: summnx
Дата сообщения: 29.12.2010 09:08
mcdie
Дело в том, что там не фиксированная длина столбца, а ячейки постепенно заполняться будут, например 20000 ячеек заполненных, 20500 и т.д Можно как-нибудь посчитать автоматом?
Автор: mcdie
Дата сообщения: 29.12.2010 12:18
Cells.SpecialCells(xlLastCell).Row - у тебя и считает последний заполненный столбец, но он также может быть и пустым (не всегда считается так как нужно), поэтому может вручную если постчитать последний, то правильнее будет

Пример:

Код: Sub ggg()
Dim I As Long, Summ As Double, sred As Double
sred = 0
Summ = 0
ACount = 1
While Trim(Cells(ACount, 1)) <> ""
ACount = ACount + 1
Wend
For I = 1 To (ACount - 1) Step 5
Summ = Summ + Cells(I, 1)
sred = sred + 1
Next I
Cells(1, 2) = Summ / sred
End Sub
Автор: summnx
Дата сообщения: 29.12.2010 14:44
Спасибо большое за помощь ZlydenGL и mcdie

Разобрался в чем дело, оказывается и первый макрос работал (который без проверки ячейки), просто я немножко неправильно проверял на калькуляторе.
Автор: Omsk
Дата сообщения: 29.12.2010 15:44
Мне нужно исправить код, чтобы поиск в таких строках файла XML <item name="okpo" value="00109725" /> был по слову "okpo", а не по атрибутам value.

Сейчас код такой:

Цитата:
Dim nodeList As Object
Dim xmldoc As Object
Dim xmlNode As Object
Dim xmlNodeRazdel As Object
Dim xmlNodeStroka As Object
Set nodeList = xmldoc.selectNodes("*/title")
Set xmlNode = nodeList.Item(0).cloneNode(True)
okpo = xmlNode.childNodes(0).Attributes(1).Value

ниже пример файла XML

[more]<?xml version="1.0" encoding="utf-8" ?>
- <report code="610013001012" form="1" shifr="stk_un_p1" year="2010" period="11">
- <title>
<item name="okpo" value="00109725" />
<item name="name" value="ОАО "Омский"" />
<item name="leader_fio" value="Иванов В.В." />
<item name="responsible_post" value="экономист" />
<item name="responsible_fio" value="Гребенщиков В.А." />
<item name="phone" value="00-00-00" />
</title>
- <sections>
- <section code="1">
- <row code="1">
<col code="1">12051</col>
<col code="2">18498</col>
<col code="3">1118</col>
</row>
- <row code="15">
<col code="1">16</col>
</row>
- <row code="17">
<col code="1">18</col>
</row>
- <row code="19">
<col code="1">20</col>
</row>
</section>
- <section code="2">
[/more]
Не могу сделать, как искать по "okpo", был такой вариант текста:

Цитата:
For n = 0 To xmlNode.childNodes.Length - 1
If xmlNode.childNodes(n).nodeTypedValue = "okpo" Then
okpo = xmlNode.childNodes(0).Attributes(n).Value
End If
Next n

Но тоже не работает.
Автор: AndVGri
Дата сообщения: 30.12.2010 04:36
Omsk

Код:
Dim nextNode As Object, pItem As Object
Set xmlNode = xmlDoc.SelectSingleNode("*/title")

For Each nextNode In xmlNode.ChildNodes
Set pItem = nextNode.Attributes.getNamedItem("name")
If Not pItem Is Nothing Then
If pItem.NodeValue = "okpo" Then
Set pItem = nextNode.Attributes.getNamedItem("value")
If Not pItem Is Nothing Then Debug.Print pItem.NodeValue
End If
End If
Next nextNode
Автор: Zloy_Gelud
Дата сообщения: 30.12.2010 08:29
Имеется два прайса. Необходимо из первого прайса выбрать значения первых ячеек каждой строки. Значения - это строка, состоящая из нескольких слов, разделенных пробелом. Также необходимо представить эту строку в виде массива из слов (функция Split, разделитель - пробел). Далее, выбрать из этого массива последний пункт и записать его в другой массив.
Вообщем должно получиться следующее, - массив, имеющий столько пунктов, сколько строк в прайсе, пункты имеет значения, равные последнему слову в первой ячейки каждой строки. Вот. Буду признателен, если кто поможет.
Автор: ferias
Дата сообщения: 01.01.2011 18:16

Код: Sub Test()
Dim a() As String, b() As String, i As Long, j As Long
j = Range("A65536").End(xlUp).Row ' Exel 2003
ReDim b(1 To j)

For i = 1 To j
ReDim a(1 To UBound(Split(Cells(i, 1).Value, " ", -1, vbTextCompare)))
a = Split(Cells(i, 1).Value, " ", -1, vbTextCompare)
b(i) = a(UBound(a))
Next i

For i = 1 To j
Debug.Print b(i) ' здесь укажите куда собираетесь выложить эти данные, _
хотя это можно сделать еще в первом цикле, но так как вы хотели получить массив?, пожалуйста пользуйтесь.
Next i
End Sub
Автор: Dmitriy05
Дата сообщения: 05.01.2011 17:15
Excel 2003:

При нажатии на кнопку необходимо выделить 2 разных участка ("A1:D1" и "A3:D3") и далее скопировать объединение этих участков.

Имеем код:

Код:
Dim r1 As Range, r2 As Range, r3 As Range
Worksheets("Лист1").Activate
Set r1 = Range("A1:D1")
Set r2 = Range("A3:D3")
Set r3 = Union(r1, r2)
r3.Select
r3.Copy
Автор: ferias
Дата сообщения: 05.01.2011 22:10
Если я не ошибаюсь, то эти черные полоски обозначают именно выделение при "вырезании" или "копировании", поэтому я предполагаю что выделение не пропало. Вопрос в том, чего именно, вы пытаетесь достичь,? возможно этот вопрос можно решить каким-то другим образом. Опишите ваши последующие действия.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

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


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