powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / программно поставить сумму с разных листов экселя
25 сообщений из 95, страница 1 из 4
программно поставить сумму с разных листов экселя
    #38603685
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте, в приведённом коде ладно последняя строка указывает на ошибку
но предпоследняя строка то в честь чего? - с чего в строковую переменную я не могу написать нужное??
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim Но As Long
    Dim Ст As String
    Dim Formula1 As String
    Dim Ном As Long
    Но = 2
    Ст = "A"
    Ном = 39
    Formula1 = "=(" & Ст & Ном - 1 & "+" & Worksheets(Но - 1) & "!" & Ст & Ном & ")"
    Worksheets(Но).Range(Ст & Ном).Formula = "=(" & Ст & Ном - 1 & "+" & Worksheets(Но - 1) & "!" & Ст & Ном & ")"
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38603731
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эндрю, с чего ты взял, что можешь записать лист в текстовую переменную?
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38603777
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, но я же это делаю в Экселе
да и ранее мне подсказывали
Код: vbnet
1.
Worksheets(1).Range("A6").Formula = "=" & Sheets(i).Name & "!A2+" & Sheets(j).Name & "!A8"


и как быть?
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38603853
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сравнить две эти строки между собой
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38603889
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
.Name - май нейм Эндрю, спасибо!!!!! пробую
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38604004
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа, да уж одна голова хорошо, а две лучше
всё срослось
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38604820
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тема моя так, что можно и пофлудить, нужда заставила с Экселем работать
как-то мне г-н Скукотища давал пример супер запроса к таблице Эксель, увы потерял я ссылку на это, как искать хз
это вроде SQL запросы называются?
как искать уже готовые рабочие запросы - примеры для этих целей для знакомства, спасибо
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38604869
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тебе готовый пример, ищи на форуме по аналогии
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim cn As Object, rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ThisWorkbook.FullName + ";Extended Properties='Excel 8.0'"
rs.Open "select NUM, Sum(SUM) from [Лист2$] group by NUM order by Sum(SUM) DESC", cn, 3
Cells(1, 5).CopyFromRecordset rs
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing


Если вы используете для подключения OLE DB и параметр HDR=Yes, то обращаться к полям нужно по именам, оказавшимся в первой строке диапазона-источника. Можете выставить HDR=No, тогда имена полей будут F1, F2, F3 и т.д.
Не забывайте, что при использовании параметра IMEX=1 все данные преобразуются в текст!
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38604872
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только, не осилив за четыре года разницу между типами данных, осилить хотя бы элементарный запрос на SQL тебе точно не светит
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605625
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что надо нашёл
10460736
выложу чтобы не забыть
сорри пока некогда
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605961
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
куда там
4 года назад пробовал, работало
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
Option Explicit

Sub SmartCopy()

Const s_WkSheetFrom$ = "Лист1"      ' лист-источник
Const s_WkSheetTo$ = "Лист2"        ' лист-получатель
Const i_MaxCriteria% = 8            ' кол-во "критериев"
                        ' (!) при большом кол-ве критериев рискуем нарваться
                        ' на ограничение длины текста запроса

Dim oCnn As Object, oRst As Object  ' подключение и наборзаписей (ADO)
Dim sConnStr$                       ' строка соединения
Dim sSQL$                           ' текст запроса
Dim sFrom$                          ' auxiliarry var
Dim i%                              ' counter


' формирование текста запроса
sFrom = " FROM [" & s_WkSheetFrom & "$]"

sSQL = "SELECT [Дата], 'Данные1' as Критерий, [Данные1] as Показатель"
sSQL = sSQL & sFrom

For i = 2 To i_MaxCriteria
    sSQL = sSQL & " UNION ALL"
    sSQL = sSQL & " SELECT [Дата], 'Данные" & i & "', [Данные" & i & "]"
    sSQL = sSQL & sFrom
Next i

' строка подключения к файлу Excel
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Data Source=" _
    & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'"

' создание объекта подключение, открытие подключения
Set oCnn = CreateObject("ADODB.Connection")
oCnn.Open sConnStr

' создание объекта наборзаписей как результат выполнения запроса в подключении
Set oRst = oCnn.Execute(sSQL)


With Worksheets(s_WkSheetTo)
    ' формирование заголовков столбцов на листе-получателе
    For i = 0 To oRst.Fields.Count - 1
        .Cells(1, i + 1).Value = oRst(i).Name
    Next i
    
    ' копирование данных из наборзаписей на лист-получатель
    .Range("A2").CopyFromRecordset oRst
End With

' закрытие и уничтожение объектов наборзаписей и подключение
oRst.Close: Set oRst = Nothing
oCnn.Close: Set oCnn = Nothing

End Sub


щас на строке Set oRst = oCnn.Execute(sSQL)
получаю ошибку, что за ересь?
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605976
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
' формирование текста запроса
sFrom = " FROM [" & s_WkSheetFrom & "$]"

sSQL = "SELECT [Дата], 'Данные1' as Критерий, [Данные1] as Показатель"
sSQL = sSQL & sFrom

For i = 2 To i_MaxCriteria
sSQL = sSQL & " UNION ALL"
sSQL = sSQL & " SELECT [Дата], 'Данные" & i & "', [Данные" & i & "]"
sSQL = sSQL & sFrom
Next i
'Данные1' - почему не квадратные скобки?
Я бы написал CStr(i) вместо i, хотя это вряд ли критично.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605977
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
' формирование текста запроса
sFrom = " FROM [" & s_WkSheetFrom & "$]"

sSQL = "SELECT [Дата], 'Данные1' as Критерий, [Данные1] as Показатель"
sSQL = sSQL & sFrom

For i = 2 To i_MaxCriteria
    sSQL = sSQL & " UNION ALL"
    sSQL = sSQL & " SELECT [Дата], 'Данные" & i & "', [Данные" & i & "]"
    sSQL = sSQL & sFrom
Next i


'Данные1' - почему не квадратные скобки?
Я бы написал CStr(i) вместо i, хотя это вряд ли критично.
В общем и целом дело в апострофах.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605979
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zchvv,
Спасибо, попробую, видите ли
эти Данные1 и четыре года назад были не в квадратных скобках и проходило
я же пробовал
что изменилось) хз
пысы
а Челябинск это в челябинской области? :)
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605981
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял в строке
Код: vbnet
1.
sSQL = "SELECT [Дата], 'Данные1' as Критерий, [Данные1] as Показатель"


надо писать
Код: vbnet
1.
sSQL = "SELECT [Дата], [Данные1] as Критерий, [Данные1] as Показатель"


увы и ах не помогло
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605982
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если покажете хоть краешек данных, проблема решится быстрее.
p.s. Да.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605984
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В цикле тоже.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605989
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zchvv,
цикл
Код: vbnet
1.
2.
3.
4.
5.
For i = 2 To i_MaxCriteria
    sSQL = sSQL & " UNION ALL"
    sSQL = sSQL & " SELECT [Дата], 'Данные" & i & "', [Данные" & i & "]"
    sSQL = sSQL & sFrom
Next i


ну нет слова Данные1 - предполагаю что ....
колдовать можно до утра
можете подправить?? чтобы не колдовать
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605990
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For i = 2 To i_MaxCriteria
sSQL = sSQL & " UNION ALL"
sSQL = sSQL & " SELECT [Дата], [Данные" & i & "], [Данные" & i & "]"
sSQL = sSQL & sFrom
Next i
Почему оба поля в запросе имеют одинаковое имя?
Не видя данные, трудно посоветовать наверняка.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605991
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять забыл форматирование.
Код: vbnet
1.
2.
3.
4.
5.
For i = 2 To i_MaxCriteria
sSQL = sSQL & " UNION ALL"
sSQL = sSQL & " SELECT [Дата], [Данные" & i & "], [Данные" & i & "]"
sSQL = sSQL & sFrom
Next i


Почему оба поля в запросе имеют одинаковое имя?
Не видя данные, трудно посоветовать наверняка.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38605993
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zchvv,
да нет у меня никаких данных я только знакомлюсь, 4 года пробовал, взлетело - офигел
щас не прёт
есть у Вас простейшие примеры уже в файле Экселя? приложьте пжл
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38606000
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
'Этот код поместите в ОБЩИЙ модуль:
Public cn As ADODB.Connection
Public rs As ADODB.Recordset
Public pusto As Boolean
Dim errmsg As String
Dim adoerr As ADODB.Error

Public Sub ВыполнитьКоманду(ByVal cnstr As String, ByVal sqlquery As String, ByVal aq As Boolean)
Set cn = CreateObject("ADODB.Connection")
cn.Mode = adModeReadWrite
cn.Open cnstr
        If aq Then
            cn.Execute sqlquery
            cn.Close
            Set cn = Nothing
        Else
            Set rs = CreateObject("ADODB.Recordset")
            rs.CursorType = adOpenStatic
            rs.LockType = adLockBatchOptimistic
            Set rs = cn.Execute(sqlquery)
        End If
End Sub
Public Sub УничтожитьНаборЗаписей(ByVal cntn As Connection, ByVal rst As Recordset)
If Not rst Is Nothing Then
    If rst.State = adStateOpen Then
        rst.Close
    End If
    Set rst = Nothing
End If
If Not cntn Is Nothing Then
    If cntn.State = adStateOpen Then
        cntn.Close
    End If
    Set cntn = Nothing
End If
End Sub
Public Sub ПроверитьНаПустоту(ByVal cntn As Connection, ByVal rst As Recordset)
If rst.BOF = True And rst.EOF = True Then
    rst.Close
    Set rst = Nothing
    cntn.Close
    Set cntn = Nothing
    pusto = True
Else
    pusto = False
End If
End Sub
Public Sub ОбработатьОшибкуЗапроса(ByVal cntn As Connection, ByVal rst As Recordset)
If Not rst Is Nothing Then
    If rst.State = adStateOpen Then
        rst.Close
    End If
Set rst = Nothing
End If
errmsg = ""
If Not cntn Is Nothing Then
    For Each adoerr In cntn.Errors
        errmsg = errmsg & vbCr & "Номер ошибки: " & CStr(adoerr.Number)
        errmsg = errmsg & vbCr & "Описание ошибки: " & adoerr.Description
    Next
    cntn.Errors.Clear
    If cntn.State = adStateOpen Then
        cntn.Close
    End If
    Set cntn = Nothing
End If
If errmsg = "" Then
    errmsg = errmsg & vbCr & "Номер ошибки: " & CStr(Err.Number)
    errmsg = errmsg & vbCr & "Описание ошибки: " & Err.Description
End If
MsgBox errmsg, , "Произошла ошибка"
End Sub
Public Sub ОбработатьОшибкуКоманды(ByVal cntn As Connection)
errmsg = ""
If Not cntn Is Nothing Then
    For Each adoerr In cntn.Errors
        errmsg = errmsg & vbCr & "Номер ошибки: " & CStr(adoerr.Number)
        errmsg = errmsg & vbCr & "Описание ошибки: " & adoerr.Description
    Next
    cntn.Errors.Clear
    If cntn.State = adStateOpen Then
        cntn.Close
    End If
    Set cntn = Nothing
End If
If errmsg = "" Then
    errmsg = errmsg & vbCr & "Номер ошибки: " & CStr(Err.Number)
    errmsg = errmsg & vbCr & "Описание ошибки: " & Err.Description
End If
MsgBox errmsg
End Sub



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
' Этот код повесьте на кнопку:
On error GoTo errline
Dim cns As String
'cns = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0 Macro;HDR=Yes'"
cns= "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Data Source=" _
    & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'"
Set cn = New ADODB.Connection
cn.Mode = adModeReadWrite
cn.Open cns
sqltext = "SELECT [Поле1],[Поле3] FROM [ Лист1$A1:C6]"
ВыполнитьКоманду cns, sqltext, False
set ws=Thisworkbook.Worksheets.Add
ws.name="РезультатЗапроса"
With Worksheets("РезультатЗапроса")
    ' формирование заголовков столбцов на листе-получателе
    For i = 0 To rs.Fields.Count - 1
        .Cells(1, i + 1).Value = rs.Fields(i).Name
    Next i    
    ' копирование данных из набора записей на лист-получатель
    .Cells(2,1).CopyFromRecordset rs
End With
УничтожитьНаборЗаписей cn, rs
Exit Sub

errline:
ОбработатьОшибкуЗапроса cn, rs
End Sub



Если у Вас Excel 2007, выберите первое значение cns и сохраните файл с расширением xlsm.
Если не будет работать - спрашивайте.
Читайте много про SQL.
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38606001
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл рисунок
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38606002
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал 3 лишние строки, касающиеся cn
' Этот код повесьте на кнопку:
On error GoTo errline
Dim cns As String
'cns = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0 Macro;HDR=Yes'"
cns= "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Data Source=" _
& ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'"
sqltext = "SELECT [Поле1],[Поле3] FROM [ Лист1$A1:C6]"
ВыполнитьКоманду cns, sqltext, False
set ws=Thisworkbook.Worksheets.Add
ws.name="РезультатЗапроса"
With Worksheets("РезультатЗапроса")
' формирование заголовков столбцов на листе-получателе
For i = 0 To rs.Fields.Count - 1
.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i
' копирование данных из набора записей на лист-получатель
.Cells(2,1).CopyFromRecordset rs
End With
УничтожитьНаборЗаписей cn, rs
Exit Sub

errline:
ОбработатьОшибкуЗапроса cn, rs
End Sub
...
Рейтинг: 0 / 0
программно поставить сумму с разных листов экселя
    #38606003
zchvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал 3 лишние строки, касающиеся cn
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
' Этот код повесьте на кнопку:
On error GoTo errline
Dim cns As String
'cns = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0 Macro;HDR=Yes'"
cns= "Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read;Data Source=" _
& ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'"
sqltext = "SELECT [Поле1],[Поле3] FROM [ Лист1$A1:C6]"
ВыполнитьКоманду cns, sqltext, False
set ws=Thisworkbook.Worksheets.Add
ws.name="РезультатЗапроса"
With Worksheets("РезультатЗапроса")
' формирование заголовков столбцов на листе-получателе
For i = 0 To rs.Fields.Count - 1
.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i 
' копирование данных из набора записей на лист-получатель
.Cells(2,1).CopyFromRecordset rs
End With
УничтожитьНаборЗаписей cn, rs
Exit Sub

errline:
ОбработатьОшибкуЗапроса cn, rs
End Sub
...
Рейтинг: 0 / 0
25 сообщений из 95, страница 1 из 4
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / программно поставить сумму с разных листов экселя
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]