Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / программно поставить сумму с разных листов экселя / 25 сообщений из 95, страница 1 из 4
03.04.2014, 07:27
    #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
03.04.2014, 09:16
    #38603731
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Эндрю, с чего ты взял, что можешь записать лист в текстовую переменную?
...
Рейтинг: 0 / 0
03.04.2014, 09:48
    #38603777
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Shocker.Pro, но я же это делаю в Экселе
да и ранее мне подсказывали
Код: vbnet
1.
Worksheets(1).Range("A6").Formula = "=" & Sheets(i).Name & "!A2+" & Sheets(j).Name & "!A8"


и как быть?
...
Рейтинг: 0 / 0
03.04.2014, 10:22
    #38603853
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
сравнить две эти строки между собой
...
Рейтинг: 0 / 0
03.04.2014, 10:36
    #38603889
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Shocker.Pro,
.Name - май нейм Эндрю, спасибо!!!!! пробую
...
Рейтинг: 0 / 0
03.04.2014, 11:45
    #38604004
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
катастрофа, да уж одна голова хорошо, а две лучше
всё срослось
...
Рейтинг: 0 / 0
03.04.2014, 20:35
    #38604820
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
тема моя так, что можно и пофлудить, нужда заставила с Экселем работать
как-то мне г-н Скукотища давал пример супер запроса к таблице Эксель, увы потерял я ссылку на это, как искать хз
это вроде SQL запросы называются?
как искать уже готовые рабочие запросы - примеры для этих целей для знакомства, спасибо
...
Рейтинг: 0 / 0
03.04.2014, 21:57
    #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
03.04.2014, 21:58
    #38604872
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Только, не осилив за четыре года разницу между типами данных, осилить хотя бы элементарный запрос на SQL тебе точно не светит
...
Рейтинг: 0 / 0
04.04.2014, 15:58
    #38605625
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
что надо нашёл
10460736
выложу чтобы не забыть
сорри пока некогда
...
Рейтинг: 0 / 0
05.04.2014, 06:24
    #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
05.04.2014, 09:42
    #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
05.04.2014, 09:45
    #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
05.04.2014, 09:49
    #38605979
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
zchvv,
Спасибо, попробую, видите ли
эти Данные1 и четыре года назад были не в квадратных скобках и проходило
я же пробовал
что изменилось) хз
пысы
а Челябинск это в челябинской области? :)
...
Рейтинг: 0 / 0
05.04.2014, 09:56
    #38605981
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
я так понял в строке
Код: vbnet
1.
sSQL = "SELECT [Дата], 'Данные1' as Критерий, [Данные1] as Показатель"


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


увы и ах не помогло
...
Рейтинг: 0 / 0
05.04.2014, 10:01
    #38605982
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Если покажете хоть краешек данных, проблема решится быстрее.
p.s. Да.
...
Рейтинг: 0 / 0
05.04.2014, 10:01
    #38605984
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
В цикле тоже.
...
Рейтинг: 0 / 0
05.04.2014, 10:08
    #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
05.04.2014, 10:13
    #38605990
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
For i = 2 To i_MaxCriteria
sSQL = sSQL & " UNION ALL"
sSQL = sSQL & " SELECT [Дата], [Данные" & i & "], [Данные" & i & "]"
sSQL = sSQL & sFrom
Next i
Почему оба поля в запросе имеют одинаковое имя?
Не видя данные, трудно посоветовать наверняка.
...
Рейтинг: 0 / 0
05.04.2014, 10:15
    #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
05.04.2014, 10:17
    #38605993
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
zchvv,
да нет у меня никаких данных я только знакомлюсь, 4 года пробовал, взлетело - офигел
щас не прёт
есть у Вас простейшие примеры уже в файле Экселя? приложьте пжл
...
Рейтинг: 0 / 0
05.04.2014, 11:04
    #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
05.04.2014, 11:06
    #38606001
zchvv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
программно поставить сумму с разных листов экселя
Забыл рисунок
...
Рейтинг: 0 / 0
05.04.2014, 11:10
    #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
05.04.2014, 11:13
    #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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / программно поставить сумму с разных листов экселя / 25 сообщений из 95, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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