Excel select from sheet

Содержание

  1. Selecting and Activating Cells
  2. Using the Select Method and the Selection Property
  3. Selecting Cells on the Active Worksheet
  4. Activating a Cell Within a Selection
  5. Support and feedback
  6. Select * from Excel WorkSheet
  7. Guest
  8. Advertisements
  9. Scott M.
  10. Guest
  11. Advertisements
  12. Paul Clement
  13. Ask a Question
  14. Similar Threads
  15. Эффективная работа в MS Office
  16. Экономия 5 минут в час за счет более продуктивной работы дает за год экономию в 4 рабочие недели
  17. Excel VBA. SQL-запросы в подключениях
  18. How to run a SQL query on an Excel table?
  19. 11 Answers 11
  20. Further notes
  21. SELECT * FROM [sheet1$]

Selecting and Activating Cells

In Microsoft Excel, you usually select a cell or cells and then perform an action, such as formatting the cells or entering values in them. In Visual Basic, it is usually not necessary to select cells before modifying them.

For example, to enter a formula in cell D6 using Visual Basic, you don’t need to select the range D6. Just return the Range object for that cell, and then set the Formula property to the formula you want, as shown in the following example.

For more information and examples of using other methods to control cells without selecting them, see How to: Reference Cells and Ranges.

Using the Select Method and the Selection Property

The Select method activates sheets and objects on sheets; the Selection property returns an object that represents the current selection on the active sheet in the active workbook. Before you can use the Selection property successfully, you must activate a workbook, activate or select a sheet, and then select a range (or other object) using the Select method.

The macro recorder will often create a macro that uses the Select method and the Selection property. The following Sub procedure was created using the macro recorder, and it shows how Select and Selection work together.

The following example performs the same task without activating or selecting the worksheet or cells.

Selecting Cells on the Active Worksheet

If you use the Select method to select cells, be aware that Select works only on the active worksheet. If you run your Sub procedure from the module, the Select method will fail unless your procedure activates the worksheet before using the Select method on a range of cells. For example, the following procedure copies a row from Sheet1 to Sheet2 in the active workbook.

Activating a Cell Within a Selection

Use the Activate method to activate a cell within a selection. There can be only one active cell, even when a range of cells is selected. The following procedure selects a range and then activates a cell within the range without changing the selection.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Select * from Excel WorkSheet

Guest

I know I can select data from a Excel worksheet using the following command
text.

«Select * From [Sheet1$]»

That is ok for the worksheet using default name «Sheet1». But, how can I
select data from a wroksheet that I don’t know it’s name. Can I use somthing
like

«Select * From Sheet[0]»

Of course, the above doesn’t work. Can anyone tell me how to do it?

Thanks for any help!

Advertisements

Scott M.

If you are using the Excel Object Library, you can refer to a sheet in
several ways:

The sheet Name (Sheet1)
Via the sheets collection (Sheets(n) or Sheets(«sheetName»))
The current sheet (ActiveSheet)

Guest

u can use some thing like this

«select * from [» & strShetname & «$]»

where «strShetname » is the name of the sheet.Please note that you can take
the
name of the sheet from active sheet
like this
Dim oApp As New Excel.Application
Dim oBooks As Excel.Workbooks = oApp.Workbooks
Dim oBook As Excel.Workbook = oBooks.Add(fileName)
Dim oSheet As Excel.Worksheet = oApp.ActiveSheet()
strShetname = oSheet.Name

hope it will solve ur problem..

Advertisements

Paul Clement

¤ Hi all,
¤
¤ I know I can select data from a Excel worksheet using the following command
¤ text.
¤
¤ «Select * From [Sheet1$]»
¤
¤ That is ok for the worksheet using default name «Sheet1». But, how can I
¤ select data from a wroksheet that I don’t know it’s name. Can I use somthing
¤ like
¤
¤ «Select * From Sheet[0]»
¤
¤ Of course, the above doesn’t work. Can anyone tell me how to do it?
¤

Recently posted a couple of times:

Microsoft MVP (Visual Basic)

Ask a Question

Want to reply to this thread or ask your own question?

You’ll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Similar Threads

VBA Excel — Select a value from one cell in Excel to update a SQL table 1 Aug 6, 2021
Excel How to capture data to a specified excel sheet(first workbook) of two different workbooks from the 0 Sep 1, 2018
Excel VBA to move cells to sheet2 based on selection in sheet1 0 Aug 3, 2018
Excel Copy cells from one worksheet to another workseet — increment row & do again 0 Oct 11, 2020
Excel Columns moving up and down on their own in a worksheet. What Goes? 2 Jan 20, 2022
Excel VBA help: Text file formatting 19 Jun 6, 2014
Variable to rename a tab in a worksheet via VBA 5 Aug 4, 2012
Excel Already selected values from DropDown list dynamically updating on multiple sheets 10 Feb 25, 2018

PC Review is a computing review website with helpful tech support forums staffed by PC experts. If you’re having a computer problem, ask on our forum for advice.

Источник

Эффективная работа в MS Office

Экономия 5 минут в час за счет более продуктивной работы дает за год экономию в 4 рабочие недели

Excel VBA. SQL-запросы в подключениях

UPDATE 21.10.15 Добавил «обратный» макрос — VBA в SQL и макрос для доступа к строке запроса SQL

Некоторое время назад я прошел несколько курсов по SQL. И мне было очень интересно — какую часть из мощного инструмента под названием T-SQL можно применять без использования SQL-Server (не дают мне сервачек под мои нужды, хнык-хнык).

Итак… Начнем с простого — подключение через Query Table в VBA. Можно записать через макрорекордер — для этого нужно создать подключение через Microsoft Query.

Выбираем Excel Files, указываем путь к файлу (пытаясь при этом не ругать разработчиков за интерфейс из 90х годов), фильтруем как-угодно поля. Нам сейчас это не важно — главное получить код, который дальше можно будет корректировать.

Должно получится что-то вроде этого:

Строчка .CommandText = «SELECT…» — отвечает за SQL запрос. Если хотя бы немного почитать поисковую выдачу google по запросу QueryTable можно упростить код до следующего:

Теперь начинаем копаться глубже — какого уровня запросы можно строить из VBA. Самые-самые базовые, основные конструкции — все работает, все ок.

Заполнение нового столбца одинаковым значением

Переименование столбцов

Фильтрация записей

Сортировка

Агрегация записей

Дату можно впрямую через конструкцию

Но я люблю отталкиваться от текущей даты. За пару текущая дата-время отвечает функция SYSDATETIME() и она может вернуть в том числе текущий день. Для этого нужна еще одна функция — CONVERT(type,value)

С функцией DATEFROMPARTS строка запроса в Excel почему-то не дружит, поэтому придется использовать костыли функцию DATEADD:

Эта строчка в любой день октября 2015 вернет значение — 30.11.15 23:59

А теперь — немного best practice!

Объединение + Агрегация + Join + Подзапросы. И самое интересное — подключение к нескольким источникам:

Одна проблема — если осуществлять такого вида запрос для соединения нескольких Excel-файлов, он будет выполняться достаточно медленно. У меня вышло порядка 2 минут. Но не стоит думать что это бесполезно — если подобные запросы выполнять при подключении к SQL-серверу, то время обработки будет 1-2 секунды (само собой, все зависит от сложности запроса, базы, и прочие прочие факторы).

Бонусы

Формировать более-менее сложный запрос SQL вручную в VBA мягко говоря неудобно. Поэтому я написал мини-макрос, который берет информацию из буфера обмена, и возвращает туда строчки для вставки в VBE.

Сами запросы просто и удобно создавать, например, используя Notepad++. Создали многострочный запрос SQL, копируете его в буфер обмена, запускаете макрос и вуаля — в буфере обмена строчки кода, готовые для вставки в ваши макросы. При желании вы можете настроить название переменной и количество табуляций.

И еще один небольшой бонус. Если у вас есть отчет по менеджерам/руководителям, построенный на запросах, то вам наверняка потребуется получать доступ к строке запроса через VBA. Сделать это можно через замечательную команду .CommandText — работает на чтение и запись. Мне для формирования отчета на 25 человек очень пригодился.

Источник

How to run a SQL query on an Excel table?

I’m trying to create a sub-table from another table of all the last name fields sorted A-Z which have a phone number field that isn’t null. I could do this pretty easy with SQL, but I have no clue how to go about running a SQL query within Excel. I’m tempted to import the data into postgresql and just query it there, but that seems a little excessive.

For what I’m trying to do, the SQL query SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname would do the trick. It seems too simple for it to be something that Excel can’t do natively. How can I run a SQL query like this from within Excel?

11 Answers 11

There are many fine ways to get this done, which others have already suggestioned. Following along the «get Excel data via SQL track», here are some pointers.

Excel has the «Data Connection Wizard» which allows you to import or link from another data source or even within the very same Excel file.

As part of Microsoft Office (and OS’s) are two providers of interest: the old «Microsoft.Jet.OLEDB», and the latest «Microsoft.ACE.OLEDB». Look for them when setting up a connection (such as with the Data Connection Wizard).

Once connected to an Excel workbook, a worksheet or range is the equivalent of a table or view. The table name of a worksheet is the name of the worksheet with a dollar sign («$») appended to it, and surrounded with square brackets («[» and «]»); of a range, it is simply the name of the range. To specify an unnamed range of cells as your recordsource, append standard Excel row/column notation to the end of the sheet name in the square brackets.

The native SQL will (more or less be) the SQL of Microsoft Access. (In the past, it was called JET SQL; however Access SQL has evolved, and I believe JET is deprecated old tech.)

Example, reading a worksheet: SELECT * FROM [Sheet1$]

Example, reading a range: SELECT * FROM MyRange

Example, reading an unnamed range of cells: SELECT * FROM [Sheet1$A1:B10]

There are many many many books and web sites available to help you work through the particulars.

Further notes

By default, it is assumed that the first row of your Excel data source contains column headings that can be used as field names. If this is not the case, you must turn this setting off, or your first row of data «disappears» to be used as field names. This is done by adding the optional HDR= setting to the Extended Properties of the connection string. The default, which does not need to be specified, is HDR=Yes . If you do not have column headings, you need to specify HDR=No ; the provider names your fields F1, F2, etc.

A caution about specifying worksheets: The provider assumes that your table of data begins with the upper-most, left-most, non-blank cell on the specified worksheet. In other words, your table of data can begin in Row 3, Column C without a problem. However, you cannot, for example, type a worksheet title above and to the left of the data in cell A1.

A caution about specifying ranges: When you specify a worksheet as your recordsource, the provider adds new records below existing records in the worksheet as space allows. When you specify a range (named or unnamed), Jet also adds new records below the existing records in the range as space allows. However, if you requery on the original range, the resulting recordset does not include the newly added records outside the range.

Data types (worth trying) for CREATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal .

Источник

SELECT * FROM [sheet1$]

I want to select from the first page of an excel file, whatever name it has, like:
strQuery = «SELECT * FROM [any_name_asigned_to_the_f irst_page] «

I’ve seen similar questions before and never seen any solution involving a simple syntax change.

What you could do is name the range with the data, then you can use the name in the query instead of the sheet name.

You would have to name the range manually I think.

Another thing you could try is retrieving the name from the Excel workbook using an ADO catalog.

No problem. I just tested this.

Change your code, accordingly:

While a named range is not needed in this instance, here’s a related solution for more on named ranges, etc.
https://www.experts-exchange.com/questions/27697002/Excel-ADO-Query-using-Named-Range.html

This kind of solution is what i am looking for, anyway I got an error:

Microsoft VBScript runtime error ‘800a01a8’

Object required: ‘ThisWorkbook’

/dtebankx/clientes_importa r_upload.a sp, line 97

ok — who’s on first? 😉

ThisWorkbook is an Excel object. We need to scope it correctly, so it can address the first sheet’s name of that workbook.

What is the basis for this vba code? Are you running this in Excel, or Access, or VBSCript, or what?

Can you share your entire sub, please?

ThisWorkbook refers to the workbook the code is in.

So unless you are running this code in Excel and the workbook you want to connect to is the workbook the code is in you can’t use it.

I don’t think this is VBA.

imnorie — that’s why I was asking those questions.

FYI —
strFirstSheet = ThisWorkbook.Sheets(1).Nam e

Will not create an «OBJECT REQUIRED» error, running from Excel.

Ok — question to the author restated:
Again, please submit your entire sub, and also advise where the code is running from?

I believe its VBSCRIPT looking at your error log. Submitting your entire sub would be useful so I can tie the code you need in with that.

The File is an Excel .xls -or .xls File
I’m using Classic ASP

The full code is this:

ASKER CERTIFIED SOLUTION

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.

GET A PERSONALIZED SOLUTION

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.

It works but only when the excel table is named (in my case) Hoja1 (that is the default name for excel in spanish), I guess in your case Sheet1. If i change the name of the sheet for any other name (included sheet1) strFirstSheet got the value Hoja2 (sheet2) so it seems to find the first sheet named with the default name.

That’s unfortunate, as that would have been elegant.

Try the script snippet I posted (tested), which will return the first sheet based on worksheet index which is generated at workbook creation time. Changing the name does not change the index. However, deleting the sheet will shift all indexes down that are after the sheet being deleted. So, deleting sheet1 would cause sheet2 (regardless of how named) to the 1st position.

I’m stuck in a permissions issue on createobject(«Excel.Applic ation») that has nothing to do with what we are talking about here. It seems that i need to have excell installed in the machine (i do) and have to go trough this:

1. From command prompt type «dcomcnfg.exe»

2. You will see ‘Component Management’ window

3. Component Services —> Computer—> My Computer—> DComConfig

4. From the tree view select ‘Microsoft Excel Application’

5. Right-Click on it & select ‘Properties’

6. From the property window select the ‘Security’ tab.

7. Then for all the three options select ‘Customize’ Radio button (or according to your need) 🙂

8. Add ‘ASPNET’ user account to all the three

9. Give appropriate permission to them

10. Then click Apply.

. only if f/&%$& «Microsoft Excel Application» was present in the list wich is not.
It will take me some time to deal with this to be able to test your code, I’ll keep trying and post back as soon as i can test it.

Excell have sheets like this (my case, in spanish):

| Hoja1 | Hoja2 | Hoja3 |

The first sheet is Hoja1 (where the information is)

If i change the name of Hoja1 to, let’s say: CLIENTS

| CLIENTS | Hoja2 | Hoja3 |

Your code gives me the Value: Hoja2 in strFirstSheet instead of CLIENTS

So it works but only if the sheets have the default name.

If I rename CLIENTS for Hoja1

strFirstSheet value is Hoja1

@jsbx — well, that bites. Let me know.

I don’t know why that’s happening, when I change the name to ‘CLIENTS’ the code returns that as the sheet name.

How are you renaming the sheets?

Opening Excel, right click on sheet’s name / rename and then Close Excel and then try again.

Silly question but did you save the workbook?

Also, why not use a named range?

Update: your code does work — in some cases — with some sheet names. I really can’t understand why . look: http://www.interchile.com/excel.png

yes i save it every time 😉

However, if you can touch the Excel file, can you not determine the name at that point and use it?

Open the Excel file, select the data and create a named range, using that name in your ADO SQL.

How to create a range name in Excel:
Here’s a good Contextures tip, which includes creating dynamic named ranges, which ADO can’t use, but on Excel workbook close, another range name can be defined that is static, which refers to the dynamic range name.

The excel file will be uploaded by users remotely, they will have to make this excel in the way i tell them and then upload it. Trying to reduce possibilities of errors (and support) «column names» and «sheet name» is something i want to get out of the equation so they can name columns whatever they want and name the sheet whatever they want and still that wont be a problem to receive and process the excel file.

I can tell them to name the sheet «Hoja1» and that’s it, but I was hoping to make the uploader more robust and handle that too. I never imagine this was going to be so problematic though.

I will try to investigate the reason why some names works and others dont, your method seems great as i dont need to have Excel installed in the server (all computers works great until you install office in them).

Just create a Workbook_BeforeSave() event that creates the range name you want, then you’ll know its there. I hesitate, but you could also rename the sheet name of the first sheet to Hoja1. You could protect the workbook such that the workbook’s structure couldn’t change — but that would entail writing macros for the users so they can add sheets, etc.

Источник

На чтение 21 мин. Просмотров 310 Опубликовано 21.02.2021

Я пытаюсь создать подтаблицу из другой таблицы со всеми полями фамилий, отсортированными от A до Z, в которых есть поле номера телефона, которое не равно нулю. Я мог бы сделать это довольно легко с SQL, но я понятия не имею, как выполнить SQL-запрос в Excel. У меня возникает соблазн импортировать данные в postgresql и просто запросить их там, но это кажется немного чрезмерным.

Для того, что я пытаюсь сделать, SQL-запрос SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname сделает свое дело. Это кажется слишком простым для того, чтобы быть чем-то, что Excel не может делать изначально. Как я могу выполнить такой SQL-запрос из Excel?


Есть много прекрасных способов сделать это, которые уже предлагали другие. Следуя пункту «получить данные Excel через дорожку SQL», вот несколько указателей.

  1. В Excel есть «Мастер подключения данных», который позволяет импортировать или ссылку из другого источника данных или даже в том же файле Excel.

  2. В составе Microsoft Office (и ОС) есть два интересных поставщика: старый ” Microsoft.Jet.OLEDB »и последний« Microsoft.ACE.OLEDB ». Ищите их при настройке соединения (например, с помощью мастера подключения к данным).

  3. После подключения к книге Excel рабочий лист или диапазон являются эквивалентом таблицы или представления. Имя таблицы рабочего листа – это имя рабочего листа со знаком доллара («$»), добавленным к нему и заключенным в квадратные скобки («[» и «]»); диапазона, это просто имя диапазона. Чтобы указать безымянный диапазон ячеек в качестве источника записей, добавьте стандартную нотацию строк/столбцов Excel в конец имени листа в квадратных скобках.

  4. Собственный SQL будет (более или менее) SQL Microsoft Access. (В прошлом он назывался JET SQL; однако Access SQL эволюционировал, и я считаю, что JET устарел, старая технология.)

  5. Пример, чтение рабочего листа : SELECT * FROM [Sheet1 $]

  6. Пример чтения диапазона: SELECT * FROM MyRange

  7. Пример, чтение безымянного диапазона ячеек: SELECT * FROM [Sheet1 $ A1: B10]

  8. Существует много-много книг и веб-сайтов, которые помогут вам разобраться в деталях.

=== Дополнительные примечания ===

По умолчанию предполагается, что первая строка вашего источника данных Excel содержит заголовки столбцов, которые можно использовать в качестве имен полей. Если это не так, необходимо отключить этот параметр, иначе первая строка данных «исчезнет» и будет использоваться в качестве имен полей. Это делается путем добавления необязательного параметра HDR = в Расширенные свойства строки подключения. По умолчанию, указывать его необязательно: HDR = Yes .. Если у вас нет заголовков столбцов, вам необходимо указать HDR = No ; поставщик называет ваши поля F1, F2 и т. д.

Предупреждение об указании листов: поставщик предполагает, что ваша таблица данных начинается с самой верхней, самой левой непустой ячейки на указанный рабочий лист. Другими словами, ваша таблица данных может без проблем начинаться в строке 3, столбце C. Однако вы не можете, например, ввести заголовок листа вверху и слева от данных в ячейке A1.

Предупреждение об указании диапазонов: когда вы указываете лист в качестве источника записей, поставщик добавляет новые записи под существующими записями на листе, если позволяет пространство. Когда вы указываете диапазон (именованный или безымянный), Jet также добавляет новые записи под существующими записями в диапазоне, если позволяет пространство. Однако, если вы запросите исходный диапазон, полученный набор записей не будет включать вновь добавленные записи вне диапазона.

Типы данных (стоит попробовать) для C REATE TABLE: Short , Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal .

Подключение к “старой технологии” Excel ( файлы с расширением xls): Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C: MyFolder MyWorkbook.xls; Extended Properties = Excel 8.0; . Используйте исходную базу данных Excel 5.0 для книг Microsoft Excel 5.0 и 7.0 (95) и используйте исходную базу данных Excel 8.0 для книг Microsoft Excel 8.0 (97), 9.0 (2000) и 10.0 (2002).

Подключение к “последней” версии Excel (файлы с расширением xlsx): Provider = Microsoft.ACE.OLEDB.12.0; Data Source = Excel2007file.xlsx; Extended Properties = "Excel 12.0 Xml; HDR = ДА; "

Обработка данных как текста: настройка IMEX обрабатывает все данные как текст. Provider = Microsoft.ACE.OLEDB.12.0; Data Source = Excel2007file.xlsx; Extended Properties = "Excel 12.0 Xml; HDR = YES; IMEX = 1";

(Подробнее на http://www.connectionstrings.com/excel)

Дополнительная информация на http://msdn.microsoft.com/en-US/library/ms141683(v= sql.90) .aspx и по адресу http://support.microsoft.com/kb/316934

Подключение к Excel через ADODB через VBA, подробное описание см. на http://support.microsoft.com/ kb/257819

Microsoft JET 4 подробности на http://support.microsoft.com/kb/275561


tl; dr; Все это делает Excel изначально – используйте фильтры и/или таблицы

(http://office.microsoft.com/en-gb/excel-help/filter-data-in- an-excel-table-HA102840028.aspx)

Вы можете открывать Excel программно через соединение oledb и выполнять SQL для таблиц на рабочем листе.

Но вы можете делайте все, что вы просите, без формул, только фильтры.

  1. щелкните в любом месте данных , на которые вы смотрите
  2. , перейдите к данным на полоса ленты
  3. выберите «Фильтр» , она примерно посередине и выглядит как воронка
    • теперь есть стрелки на стороне каждой ячейки в первой строке таблицы.
  4. щелкните стрелку на номере телефона и де- выберите пробелы (последний вариант)
  5. щелкните стрелку на фамилии и выберите порядок z (верхний вариант)

поиграйте … кое-что на заметку:

  1. вы можете выбрать отфильтрованные строки и вставить их в другое место
  2. в строке состояния слева вы увидите, сколько строк соответствует критериям фильтрации из общего количества строк. (например, 308 из 313 найденных записей)
  3. вы можете фильтровать по цвету в excel 2010 на палатах
  4. Иногда я создаю вычисляемые столбцы, которые показывают статусы или очищенные версии данных, которые вы затем можно фильтровать или сортировать по тезисам. (например, как формулы в других ответах)

ДЕЛАЙТЕ это с фильтрами, если вы не собираетесь делать это много или вы хотите автоматизировать импорт данных где-то или что-то в этом роде .. но для полнота:

Вариант c #:

  OleDbConnection ExcelFile = new OleDbConnection (String.Format ("Provider  = Microsoft.ACE.OLEDB.12.0; Источник данных = {0}; Расширенные свойства =  "Excel 12.0; HDR = ДА " ", имя файла));  ExcelFile.Open ();  

удобное место для начала – взглянуть на схему, поскольку там может быть больше, чем вы думаете:

  List  excelSheets = new List  ();//Добавляем имя листа в строковый array.foreach (строка DataRow в dt.Rows) {string temp = row ["TABLE_NAME"]  .Нанизывать();  если (temp [temp.Length - 1] == '$') {excelSheets.Add (row ["TABLE_NAME"]. ToString ());  }}  

затем, когда вы хотите запросить лист:

  OleDbDataAdapter da = new OleDbDataAdapter ("выберите * из ["  + лист + "]", ExcelFile);  dt = новый DataTable ();  da.Fill (dt);  

ПРИМЕЧАНИЕ. Используйте таблицы в excel !:

Excel имеет “таблицы “функциональность, которая заставляет данные вести себя больше как таблица … это дает вам большие преимущества, но не позволит вам выполнять все типы запросов.

http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx

Для табличных данных в Excel это мой вариант по умолчанию. Первое, что я делаю, это нажимаю на данные, затем выбираю «форматировать как таблицу» в домашнем разделе на ленте. это дает вам фильтрацию и сортировку по умолчанию и позволяет вам получать доступ к таблице и полям по имени (например, table [fieldname]), это также позволяет агрегировать функции для столбцов, например. макс. и среднее

отредактировал 24 сен ’13 в 9:38

ответил 24 сен ’13 в 9:20

  • , если вы хотите уменьшить количество столбцов, я лично копирую отфильтрованные строки на новый лист и удаляю столбцы, которые мне не нужны. их можно было спрятать, но это того не стоит. – user359135, 24 сен. ’13 в 9:22

  • using System.Data.OleDb; using System.Data; – user359135, 24 сен., 24 сен., 13:25

  • Я фильтрую каждый день и C # для доступа электронные таблицы несколько раз в неделю. при использовании С # он, как правило, заключается в импорте данных в базу данных, чтобы действительно поиграть с ней .. для фактического запроса его фильтров или sql, когда данные находятся на сервере sql, на самом деле не стоит делать на промежуточном уровне sql to excel. – user359135, 24 сен. ’13 в 9:33

добавить комментарий |


tl; dr; Все это делает Excel изначально – используйте фильтры и/или таблицы

(http://office.microsoft.com/en-gb/excel-help/filter-data-in- an-excel-table-HA102840028.aspx)

Вы можете открывать Excel программно через соединение oledb и выполнять SQL для таблиц на рабочем листе.

Но вы можете делайте все, что вы просите, без формул, просто фильтров.

  1. щелкните в любом месте данных , на которые вы смотрите
  2. перейти к данным на панели ленты
  3. выбрать «Фильтр» примерно посередине и выглядит как воронка
    • теперь у вас будут стрелки на узкой стороне каждой ячейки в первой строке таблицы.
  4. щелкните стрелку на номере телефона и отмените выбор пробелов (последний вариант)
  5. щелкните стрелку на фамилии и выберите аз-порядок (верхний вариант)

поиграйте … кое-что на заметку:

  1. вы можете выберите отфильтрованные строки и вставьте их в другое место.
  2. в строке состояния слева вы увидите, сколько строк соответствует критериям фильтрации из общего числа строк. (например, 308 из 313 найденных записей)
  3. вы можете фильтровать по цвету в excel 2010 на палатах
  4. Иногда я создаю вычисляемые столбцы, которые показывают статусы или очищенные версии данных, которые вы затем можно фильтровать или сортировать по тезисам. (например, как формулы в других ответах)

СДЕЛАЙТЕ это с фильтрами, если вы не собираетесь делать это много или вы хотите автоматизировать импорт данных где-то или что-то в этом роде.. но для полноты:

Вариант c #:

  OleDbConnection ExcelFile = new OleDbConnection (String.Format (  "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = {0}; Extended Properties = " Excel 12.0; HDR = YES  "", имя файла));  ExcelFile.Open ();  

удобное место для начала – взглянуть на схему, поскольку там может быть больше, чем вы думаете:

  List  excelSheets = new List  ();//Добавляем имя листа в строковый array.foreach (строка DataRow в dt.Rows) {string temp = row ["TABLE_NAME"]  .Нанизывать();  если (temp [temp.Length - 1] == '$') {excelSheets.Add (row ["TABLE_NAME"]. ToString ());  }}  

затем, когда вы хотите запросить лист:

  OleDbDataAdapter da = new OleDbDataAdapter ("выберите * из ["  + лист + "]", ExcelFile);  dt = новый DataTable ();  da.Fill (dt);  

ПРИМЕЧАНИЕ. Используйте таблицы в excel !:

Excel имеет “таблицы “функциональность, которая заставляет данные вести себя больше как таблица … это дает вам большие преимущества, но не позволит вам выполнять все типы запросов.

http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx

Для табличных данных в Excel это мой вариант по умолчанию. Первое, что я делаю, это нажимаю на данные, затем выбираю «форматировать как таблицу» в домашнем разделе на ленте. это дает вам фильтрацию и сортировку по умолчанию и позволяет вам получать доступ к таблице и полям по имени (например, table [fieldname]), это также позволяет агрегировать функции для столбцов, например. макс. и среднее


Вы можете сделать это изначально следующим образом:

  1. Выберите таблицу и используйте Excel, чтобы отсортировать ее по фамилии.
  2. Создайте критерии расширенного фильтра из 2 строк и 1 столбца, скажем, inE1 и E2, где E1 пусто, а E2 содержит формулу = C6 = "" , где C6 – первая ячейка данных столбца с телефонным номером.
  3. Выберите таблицу и используйте расширенный фильтр, скопируйте в диапазон, используя диапазон критериев в E1: E2 и укажите, куда вы хотите скопировать вывод в

Если вы хотите сделать это программно, я предлагаю вам использовать Macro Recorder для записи вышеуказанных шагов и посмотреть на код.

отредактировано 02 апр. ’14 в 17:52

wkschwartz

3,20611 золотых знаков2222 серебряных знака3333 бронзовых знака

ответил 17 сен ’13 в 18:47

  • Вопрос определяет SQL. – S Meaden 08 окт. ’18 в 8:27

добавить комментарий |


Вы можете сделать это изначально следующим образом:

  1. Выбрать таблицу и используйте Excel для сортировки ее по фамилии.
  2. Создайте критерии расширенного фильтра из 2 строк и 1 столбца, скажем, inE1 и E2, где E1 пусто, а E2 содержит формулу = C6 = "" , где C6 – первая ячейка данных столбца с телефонным номером.
  3. Выберите таблицу и используйте расширенный фильтр, скопируйте в диапазон, используя диапазон критериев в E1: E2 и укажите, куда вы хотите скопировать вывод

. Если вы хотите сделать это программно, я предлагаю вам использовать Macro Recorder для записи вышеуказанных шагов и просмотра кода.


Вы можете используйте SQL в Excel. Он только хорошо скрыт. См. Это руководство:

http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html

ответ дан 24 сен ’13 в 12:50

  • Похоже, он использует SQL для выбора данных для импорта в Excel, но не запускать запросы к текущей таблице? – Рап, 14 сен 2016, 09:47

  • Вам просто нужно создать имена для каждой таблицы в Excel (в диспетчере имен) или просто выбрать таблицу и ввести имя в поле, где отображается адрес ячейки. Затем вы можете использовать его для запроса к рабочему листу. В запросе у вас есть полный адрес листа, поэтому, если вы переместите электронную таблицу в другое место на диске, запрос не будет работать – Петрик 5 октября 2017 г., 13:01

добавить комментарий |


Вы можете использовать SQL в Excel. Он только хорошо скрыт. См. Это руководство:

http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193. html


Могу я предложить дать QueryStorm попробуйте – это плагин для Excel, который позволяет очень удобно использовать SQL в Excel.

Кроме того, это freemium. Если вас не интересует автозаполнение, волнистые линии ошибок и т. Д., Вы можете использовать его бесплатно. Просто скачайте и установите, и у вас будет поддержка SQL в Excel.

Отказ от ответственности: я автор.

отредактировано 12 декабря ’17 в 14:19

ответил 13 июня ’17 в 14: 05

  • К сожалению, хотя это отличный инструмент, теперь он, похоже, только платный, за исключением 30-дневной пробной версии. – Marc 14 марта ’19 в 15:31

добавить комментарий |


Могу я предложить попробовать QueryStorm – это плагин для Excel, который делает использование SQL в Excel весьма удобным.

Кроме того, это бесплатная версия. Если вас не интересует автозаполнение, волнистые линии ошибок и т. Д., Вы можете использовать его бесплатно. Просто скачайте и установите, и у вас будет поддержка SQL в Excel.

Отказ от ответственности: я автор.


Если вам нужно сделать это один раз, просто следуйте описаниям Чарльза, но это также можно сделать с помощью формул Excel и вспомогательных столбцов. на случай, если вы хотите сделать фильтр динамическим.

Предположим, ваши данные находятся в таблице DataSheet и начинаются в строке 2 следующих столбцов:

  • A: фамилия
  • B: имя
  • C: номер телефона

Вам нужны два вспомогательных столбца на этом листе .

  • D2: = if (A2 = "", 1, 0) , это столбец фильтра, соответствующий вашему условию where
  • E2: = if (D2 1, "", sumifs (D $ 2: D $ 1048576, A $ 2: A $ 1048576, ", это соответствует порядку

Скопируйте эти формулы по мере поступления ваших данных.

На листе, который должен отображать ваш результат, создайте следующие столбцы.

  • A: последовательность чисел, начинающаяся с 1 в строке 2, это ограничивает общее количество строк, которое вы можете получить (вроде как ограничение в дальнейшем)
  • B2: = match (A2, DataSheet! $ E $ 2: $ E $ 1048576, 0) , это строка соответствующих данных
  • C2: = iferror (index (DataSheet! A $ 2: A $ 1048576, $ B2), "") , это фактические данные или пусто, если данных не существует

Скопируйте формулы в B2 и C2 и скопируйте столбец C в D и E.

ответил 21 сен ’13 в 18:38


Если вам нужно сделать это один раз, просто следуйте описаниям Чарльза, но это также можно сделать с формулами Excel и вспомогательными столбцами в если вы хотите сделать фильтр динамическим.

Предположим, ваши данные находятся в таблице данных и начинаются со строки 2 следующих столбцов:

  • A: фамилия
  • B: имя
  • C: номер телефона

Вам нужны два вспомогательных столбца на этом листе.

  • D2: = if (A2 = "", 1, 0) , это столбец фильтра, соответствующий вашему условию where
  • E2: = if (D2 1, "", sumifs (D $ 2: D $ 1048576, A $ 2: A $ 1048576, ", это соответствует порядку, в котором

Скопируйте эти формулы по мере ваших данных.

На листе, который должен отображать ваш результат, создайте следующие столбцы.

  • A: последовательность чисел, начинающаяся с 1 в строке 2, это ограничивает общее количество строк, которые вы можете получить (вроде лим это в дальнейшем)
  • B2: = match (A2, DataSheet! $ E $ 2: $ E $ 1048576, 0) , это строка соответствующих данных
  • C2: = iferror (index (DataSheet! A $ 2: A $ 1048576, $ B2), "") , это фактические данные или пусто, если нет данные существуют

Скопируйте формулы в B2 и C2 и скопируйте столбец C в D и E.


Вы можете поэкспериментировать с собственным драйвером БД для Excel на языке/платформе по вашему выбору. В мире Java вы можете попробовать http://code.google.com/p/sqlsheet/, который предоставляет драйвер JDBC для непосредственной работы с листами Excel. Аналогичным образом можно получить драйверы для технологии БД для других платформ.

Однако я могу гарантировать, что вы скоро столкнетесь с проблемой количества функций, которые предоставляют эти библиотеки-оболочки. Лучше будет использовать Apache HSSF/POI или аналогичный уровень библиотеки, но для этого потребуется больше усилий по кодированию..

ответил 14 сен ’13 в 17:16


Вы можете поэкспериментировать с собственным драйвером БД для Excel на языке/платформе по вашему выбору. В мире Java вы можете попробовать http://code.google.com/p/sqlsheet/, который предоставляет драйвер JDBC для непосредственной работы с листами Excel. Аналогичным образом можно получить драйверы для технологии БД для других платформ.

Однако я могу гарантировать, что вы скоро столкнетесь с проблемой количества функций, которые предоставляют эти библиотеки-оболочки. Лучшим способом будет использовать Apache HSSF/POI или аналогичный уровень библиотеки, но для этого потребуется больше усилий по кодированию.


Возможно, я неправильно понял меня, но разве это не то, что делает сводная таблица? У вас есть данные в таблице или только в отфильтрованном списке? Если это не таблица, сделайте ее одной (ctrl + l), если это так, просто активируйте любую ячейку в таблице и вставьте сводную таблицу на другой лист. Затем добавьте столбцы фамилия, имя, номер телефона в раздел строк. Затем добавьте номер телефона в раздел фильтра и отфильтруйте нулевые значения. Теперь выполните сортировку как обычно.

ответил 20 сен. ’13 в 23:47


Возможно, я неправильно понял меня, но разве это не то, что делает сводная таблица? У вас есть данные в таблице или только в отфильтрованном списке? Если это не таблица, сделайте ее одной (ctrl + l), если это так, просто активируйте любую ячейку в таблице и вставьте сводную таблицу на другой лист. Затем добавьте столбцы фамилия, имя, номер телефона в раздел строк. Затем добавьте номер телефона в раздел фильтра и отфильтруйте нулевые значения. Теперь выполните сортировку как обычно.


I Предлагаем вам взглянуть на механизм хранения CSV MySQL, который, по сути, позволяет вам загружать любой файл CSV (легко созданный из Excel) в базу данных, как только вы его получите, вы можете использовать любую команду SQL, которую хотите.

Стоит взглянуть на это.

ответил 24 сен ’13 в 1:44


Я предлагаю вам взглянуть на механизм хранения CSV MySQL, который, по сути, позволяет загружать любой файл CSV (легко создается из Excel) в базу данных, когда она у вас есть, вы можете использовать любую команду SQL, какую захотите.

Стоит взглянуть на нее.


Если у вас есть GDAL/OGR , скомпилированный с Библиотека Expat, вы можете использовать драйвер XLSX для чтения файлов .xlsx и запускать выражения SQL из командной строки. Например, из оболочки osgeo4w в том же каталоге, что и электронная таблица, используйте утилиту ogrinfo :

  ogrinfo -dialect sqlite -sql "  SELECT name, count (*) FROM sheet1 GROUP BY name "Book1.xlsx  

запустит запрос SQLite на sheet1 и выведет запрос результат в необычной форме:

  ИНФОРМАЦИЯ: Открытие `Book1.xlsx 'с использованием драйвера` XLSX' выполнено успешно. Имя слоя: SELECTGeometry: NoneFeature Count: 36Layer SRS WKT: (unknown  ) name: String (0.0) count (*): Integer (0.0) OGRFeature (SELECT): 0 name (String) = Red count (*) (Integer) = 849OGRFeature (SELECT): 1 name (String) = Green count (  *) (Целое число) = 265 ...  

Или выполните тот же запрос с помощью ogr2ogr , чтобы создать простой файл CSV:

  $ ogr2ogr -f CSV out.csv -dialect sqlite  -sql "ВЫБРАТЬ имя, количество (*) FROM sheet1 GROUP BY name" Book1.xlsx $ cat out.csvname, count (*  ) Красный, 849Зеленый, 265 ...  

Чтобы сделать то же самое со старыми файлами .xls, вы должны Мне нужен драйвер XLS, созданный на основе библиотеки FreeXL, что не очень распространено (например, не из OSGeo4w).


Если у вас есть GDAL/OGR , скомпилированный с библиотекой Expat, вы можете использовать XLSX драйвер для чтения файлов .xlsx и запуска выражений SQL из командной строки. Например, из оболочки osgeo4w в том же каталоге, что и электронная таблица, используйте утилиту ogrinfo :

  ogrinfo -dialect sqlite -sql "  ВЫБРАТЬ имя, количество (*) ИЗ листа1 ГРУППА ПО имени "Книга1. xlsx  

выполнит запрос SQLite на sheet1 и выдаст результат запроса в необычной форме:

   ИНФОРМАЦИЯ: Открытие `Book1.xlsx 'с использованием драйвера` XLSX' успешно. Имя слоя: SELECTGeometry: NoneFeature Count: 36Layer SRS WKT: (unknown) name: String (0.0) count (*): Integer (0.0  ) OGRFeature (SELECT): 0 name (String) = Red count (*) (Integer) = 849OGRFeature (SELECT): 1 name (String) = Green count (*) (Integer) = 265 ...  

Или выполните тот же запрос с помощью ogr2ogr , чтобы создать простой файл CSV:

  $ ogr2ogr -f CSV  out.csv -dialect sqlite  -sql "ВЫБРАТЬ имя, количество (*) ИЗ листа1 ГРУППА ПО имени" Book1.xlsx $ cat out.csvname, count (*) Красный, 849Зеленый, 265 ...  

Чтобы сделать то же самое со старыми файлами .xls, вам понадобится драйвер XLS, созданный на основе библиотеки FreeXL, которая не очень распространена (например, не из OSGeo4w).


Microsoft Access и LibreOffice Base могут открывать электронную таблицу в качестве источника и запускать по ней sql-запросы. Это был бы самый простой способ выполнять все виды запросов и избегать беспорядка, связанного с запуском макросов или написанием кода.

Excel также имеет автофильтры и сортировку данных, которые позволят выполнить множество простых запросов, подобных вашему пример. Если вам нужна помощь с этими функциями, Google станет лучшим источником руководств, чем я.

ответил 20 сентября ’13 в 0:52


Microsoft Access и LibreOffice Base могут открывать электронную таблицу в качестве источника и запускать по ней sql-запросы. Это был бы самый простой способ выполнять все виды запросов и избегать беспорядка, связанного с запуском макросов или написанием кода.

Excel также имеет автофильтры и сортировку данных, которые позволят выполнить множество простых запросов, подобных вашему пример. Если вам нужна помощь с этими функциями, Google станет лучшим источником руководств, чем я.



Выполнение SQL-запросов в Excel

Раньше я использовал запросы ODBC в Excel, но всегда с хранимыми процедурами на сервере. Теперь я хотел бы иметь возможность определять в Excel запросы SQL произвольной формы, которые извлекают данные из MS SQL Server. Я играл около 30 минут и искал в Google, как это сделать, но, похоже, ничего не нашел. Как мне создавать и отлаживать SQL-запросы в Excel?

Спасибо!


Привет, @ Dave7

Лучший способ получить данные с SQL Server – использовать Power Query в Excel, вы уже сталкивались с этим?


Спасибо, @Wyn Hopkins. Я должен был сказать, что да, я попал в Power Query, но не мог понять, как использовать его для написания простого SQL. Расширенный редактор, похоже, использует другой язык (очевидно, PowerQuery). Неужели просто невозможно написать простой SQL? Если это так, я уверен, что смогу разобраться в PowerQuery, хотя, если у вас есть хороший учебник, я все слышу.


@ Dave7

Power Query не является инструментом для генерации SQL-запросов, вы можете только встроить уже подготовил SQL-запрос в коннектор к базе данных SQL. Есть плюсы и минусы, но в основном последние. Если только производительность для относительно сложных запросов, поскольку SQL-запрос выполняется на сайте сервера, но даже в этом случае лучше создать представление непосредственно на SQL-сервере и подключиться к нему.

В Power Query большая часть задач может быть выполнена с помощью пользовательского интерфейса без написания кода на M-скрипте (внутренний язык Power Query). Запрос к базе данных SQL также может быть сгенерирован из пользовательского интерфейса.


Hi @ Dave7

При подключении к базе данных SQL у вас есть возможность написать здесь простой SQL …

Если вы используете интерфейс Power Query для выполнения преобразований, тогда, если это преобразование можно преобразовать в SQL, оно будет выполнено автоматически в фоновом режиме … Часто (но не всегда) вы можете увидеть, как это происходит, щелкнув правой кнопкой мыши по шагу и просмотр собственного запроса:

Примечание:

Вы можете повысить производительность, используя шаги Power Query и позволяя ему преобразовывать и «складывать» большую часть запроса обратно в SQL Server.

Написание собственного SQL-запроса с нуля прерывает «сворачивание запроса», и обработка данных будет выполняться на вашем компьютере.

например Фильтрация только для записей этого года – если она выполняется с помощью применения фильтра в Power Query, эта фильтрация будет возвращена, чтобы сервер выполнял ее быстрее.

Несколько примеров работы из MS SQL Server  с таблицами формата Excel(.xls,.xlsx):

1)С
использованием функции OPENROWSET или с OPENDATASOURCE:

SELECT * FROM OPENROWSET(‘MSDASQL’,

‘Driver={Microsoft Excel Driver (*.xls)};

DBQ=[C:gr_otchet.xls]’, ‘SELECT * FROM [Sheet1$A8:D10000]’

Пример для OPENDATASOURCE
из BOL:

SELECT * FROM OPENDATASOURCE(‘Microsoft.Jet.OLEDB.4.0’,

‘Data
Source=C:DataFolderDocumentsTestExcel.xls;Extended Properties=EXCEL 5.0’
)…[Sheet1$] ;

Одна из
распространенных  проблем, это отсутствие
драйверов под х64 платформу, или установка х32 битных под х64 систему. Например,
драйверов Microsoft.Jet.OleDB нет 64 битных,в этом случае  можно использовать другие драйвера, к примеру
 Microsoft.ACE.OLEDB.12.0.

Не забудьте только про
Примечание из  BOL:

Функция
OPENROWSET  или  OPENDATASOURCE может быть использована
для доступа к удаленным данным из источников данных OLE DB только в том случае,
если для заданного поставщика параметр реестра DisallowAdhocAccess явно
установлен в 0 и включен параметр Ad Hoc Distributed Queries расширенной
настройки. Если эти параметры не установлены, поведение по умолчанию запрещает
нерегламентированный доступ.

Если параметр
Ad Hoc Distributed Queries выключен, то  об будет информационное сообщение. Включение
параметра осуществляется через хранимую процедуру sp_configure.

sp_configure Ad Hoc Distributed Queries, 1;

RECONFIGURE;

GO

2) Второй спосб через Linkedserver
и ODBC драйвер.

1-ый способ
хорошо, когда необходимо использовать разово, для частого и широко
использования лучше использовать технологию связанного сервера(Linked Server)

Для этого
необходимо установить на сервере MS SQL Server ODBC драйвер а для Excel, затем создать источник
данных( Администрирование ->Источники данных)

Указывает имя источника данных
,версию Excel и сам
файл.

Сохраняем источник.

После этого создаем связанный
сервер LinkedServed (связанный
сервер):

Указываем имя нашего  связанного сервера и имя созданного нами
раннего ODBC источника.

Сохраняем.

Теперь можно выполнять запросы к
нашему связанному серверу, к примеру:

select * from openquery(excel,‘select * from [sheet1$]’) – получение всех данныз из экселя

select * from openquery(excel,‘select * from
[Sheet1$A10:D2]’
) –
получение данных диапозона $A10:D2

select * from openquery(excel,‘select * from
[Sheet1$A10:D]’
) –
получение данных диапозона с A10:D до
конца файла.

3) Еще одни,
способ, когда необходим импорт разово,
то можно использовать «SQL Server Import and Export Wizard»:

Выделяем БД,  правая кнопка, Задачи, Выбираем пункт Импорт
или Экспорт:

Выбираем источник данных, наш
файл Excel, версию Excel. :

Выбираем куда
копировать данные, указываем таблицу назначение .

После этого
можно пакет запустить немедленно или его сохранить для дальнейшего
использования.

4) Кстати, 4 способ, это как раз создание пакета SSIS в Microsoft Visual Studio, результатом которого
так же будет пакет, похожий на то, что было создано в варианте 3

Делается он
просто

Выбирается Элемент потока
управления

Затем выбирается источник и
сервер назначения:

В источнике соединений создается
новое соединение с нашим файлом Excel,
в  Назначение указываем наш MS SQL Server, указываем таблицу,
сопоставляем столбцы:

После этого сохраняем пакет, и
его запускаем.

Пакет создали  и должен работать.

Удачи .

There are many fine ways to get this done, which others have already suggestioned. Following along the «get Excel data via SQL track», here are some pointers.

  1. Excel has the «Data Connection Wizard» which allows you to import or link from another data source or even within the very same Excel file.

  2. As part of Microsoft Office (and OS’s) are two providers of interest: the old «Microsoft.Jet.OLEDB», and the latest «Microsoft.ACE.OLEDB». Look for them when setting up a connection (such as with the Data Connection Wizard).

  3. Once connected to an Excel workbook, a worksheet or range is the equivalent of a table or view. The table name of a worksheet is the name of the worksheet with a dollar sign («$») appended to it, and surrounded with square brackets («[» and «]»); of a range, it is simply the name of the range. To specify an unnamed range of cells as your recordsource, append standard Excel row/column notation to the end of the sheet name in the square brackets.

  4. The native SQL will (more or less be) the SQL of Microsoft Access. (In the past, it was called JET SQL; however Access SQL has evolved, and I believe JET is deprecated old tech.)

  5. Example, reading a worksheet: SELECT * FROM [Sheet1$]

  6. Example, reading a range: SELECT * FROM MyRange

  7. Example, reading an unnamed range of cells: SELECT * FROM [Sheet1$A1:B10]

  8. There are many many many books and web sites available to help you work through the particulars.

Further notes

By default, it is assumed that the first row of your Excel data source contains column headings that can be used as field names. If this is not the case, you must turn this setting off, or your first row of data «disappears» to be used as field names. This is done by adding the optional HDR= setting to the Extended Properties of the connection string. The default, which does not need to be specified, is HDR=Yes. If you do not have column headings, you need to specify HDR=No; the provider names your fields F1, F2, etc.

A caution about specifying worksheets: The provider assumes that your table of data begins with the upper-most, left-most, non-blank cell on the specified worksheet. In other words, your table of data can begin in Row 3, Column C without a problem. However, you cannot, for example, type a worksheet title above and to the left of the data in cell A1.

A caution about specifying ranges: When you specify a worksheet as your recordsource, the provider adds new records below existing records in the worksheet as space allows. When you specify a range (named or unnamed), Jet also adds new records below the existing records in the range as space allows. However, if you requery on the original range, the resulting recordset does not include the newly added records outside the range.

Data types (worth trying) for CREATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Connecting to «old tech» Excel (files with the xls extention): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyFolderMyWorkbook.xls;Extended Properties=Excel 8.0;. Use the Excel 5.0 source database type for Microsoft Excel 5.0 and 7.0 (95) workbooks and use the Excel 8.0 source database type for Microsoft Excel 8.0 (97), 9.0 (2000) and 10.0 (2002) workbooks.

Connecting to «latest» Excel (files with the xlsx file extension): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

Treating data as text: IMEX setting treats all data as text. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

(More details at http://www.connectionstrings.com/excel)

More information at http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx, and at http://support.microsoft.com/kb/316934

Connecting to Excel via ADODB via VBA detailed at http://support.microsoft.com/kb/257819

Microsoft JET 4 details at http://support.microsoft.com/kb/275561

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Есть таблица Excel, данные которой загружаются в запрос на выборку Access
В запросе можно указать разные способы загрузки данных:
1. Загружаются данные всего листа:  SELECT [Лист1$].* FROM [Лист1$] IN » [Excel 12.0;HDR=Yes;IMEX=1;DATABASE=С:База данныхФайл.xlsx];
2. Загружаются данные заданных полей:  SELECT [Лист1$].[Поле1], [Лист1$].[Поле2],[Лист1$].[Поле3]  FROM [Excel 12.0;HDR=YES;IMEX=1;DATABASE= С:База данныхФайл.xlsx].[Лист1$]

Нужен третий вариант: загрузка данных именованного диапазона или заданного диапазона, например A3:K20. Подскажите, можно ли загружать напрямую из Excel в ЗАПРОС Access данные диапазона? Если да, то как?
Знаю как загружать именованный диапазон в Access с помощью сводных таблиц, но нужна загрузка в запрос

Изменено: Ram-zes12.01.2015 17:58:10

 

B.Key

Пользователь

Сообщений: 633
Регистрация: 26.02.2014

попробуйте просто указать имя именованного диапазона …….С:База данныхФайл.xlsx].[tbl]
где tbl имя диапазона

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

B.Key, так не получается…
Сборка по теме с учетом моих экспериментов:
1. Данные всего листа
SELECT [Лист1$].* FROM [Лист1$] IN » [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:База данныхФайл.xlsx];

2. Данные заданных полей (поля должны стоять в первой строке)
SELECT [Лист1$].[Поле1], [Лист1$].[Поле2],[Лист1$].[Поле3] FROM [Excel 12.0XML;HDR=YES;IMEX=1;DATABASE= С:База данныхФайл.xlsx].[Лист1$]

3. Данные по заданному диапазону
SELECT * FROM [Лист1$A6:A11] IN » [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:База данныхФайл.xlsx];

4. Данные по именованному диапазону
SELECT * FROM [имя диапазона] IN » [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:База данныхФайл.xlsx];

Изменено: Ram-zes15.01.2015 16:34:17

 

LVL

Пользователь

Сообщений: 903
Регистрация: 01.01.1970

Загрузка в запрос — не правильная постановка задачи (формулировка). Если я правильно понял, то вам нужно использовать значения из именованного диапазона в запросе на выборку в базе Access. Тогда я бы сделал так:
Сначала создаем связанную таблицу в этой базе (линкуем данные), а потом в самой базе выполняем нужный запрос с использованием этой таблицы без заморочек. После выполнения запроса связанную таблицу удаляем.

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Да, использовать значения…

LVL, обмен данными идет постоянно — это не разовая акция. Поэтому, как я понимаю, при удалении связанной таблицы, данные перестанут загружаться в запрос.
Изначально я так и делал, как вы описали (делал связанные таблицы в Access и обращался к ним запросами), но мои эксперименты показали, что если сразу обращаться к данным в файле  Excel из запроса с помощью SQL, то скорость обмена данными выше, а заморочек меньше. Если Вы линкуете, то перегружаете базу дополнительными таблицами, мне кажется — это лишнее промежуточное звено, особенно если нужно получать данные не с одного, а с нескольких таких файлов

 

LVL

Пользователь

Сообщений: 903
Регистрация: 01.01.1970

#6

15.01.2015 14:19:58

Цитата
Ram-zes пишет: обмен данными идет постоянно — это не разовая акция

В чем проблема, не удаляйте связанную таблицу

Цитата
Ram-zes пишет: мои эксперименты показали, что если сразу обращаться к данным в файлеExcel из запроса с помощью SQL, то скорость обмена данными выше

Доля правды в этом есть, вернее даже не так… Варианта 2:
1. Работаете с таблицами посредством SQL (в данном случае прилинковывая таблицу)
2. Формируете запрос с ограничениями сразу в нем (WHERE и т.д.)

Лично я предпочту первый вариант, он более прозрачен и его проще поддерживать, что касается производительности, то да, в теории второй вариант быстрее, но это только в теории, на практике время выполнения запроса врятле будет отличаться значительно. На самом деле вопрос несколько в ином, насколько сложно сформировать запрос сразу со всеми ограничениями? + Нужно ли будет его корректировать и как часто… Поэтому, как я уже сказал, я предпочту первый вариант.

 

LVL

Пользователь

Сообщений: 903
Регистрация: 01.01.1970

Перечитал ещё раз тему… Хочу уточнить — где находятся данные и куда их нужно вернуть? Я предполагал, что данные находятся в базе Access и вы хотите получать их с помощью запроса в файл Excel, при этом в тексте запроса использовать ограничения указанные в файле Excel… Я правильно вас понял?

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

#8

15.01.2015 14:28:51

Цитата
Ram-zes пишет: Если Вы линкуете, то перегружаете базу дополнительными таблицами

DAO.Recordset не спасет? Если в него записать SQL запрос условием отбора, после обнулить и закрыть.

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Вообще коммуникация очень сложная… Но если коротко то примерно так:
Есть файл Excel, куда вносится первичная информация (одно из полей Отдел). Информация поступает в Access и там идет нарезка этой информации на отделы, т.е. в Access есть запросы, которые и делают эту нарезку, скажем на 10 отделов (ну понятно, что в каждом запросе стоит свое условие — название отдела). C этих запросов информация отправляется в другие файлы Excel — по отделам. Там вносится необходимая информация. Затем в Access работают другие запросы, которые уже обращаются к этим файлам Excel и получают информацию в базу, есть консолидирующий запрос, который после, отправляет все данные в исходный файл.
При сохранении файлов Excel информация попадает в Access. При обновлении данных в Excel информация закачивается из Access. Ну вот как-то так.

Изменено: Ram-zes15.01.2015 14:36:16

 

LVL

Пользователь

Сообщений: 903
Регистрация: 01.01.1970

Задумчивая схема…
Т.е. всетаки обмен идет между Access и Excel — это я и хотел уточнить…
А теперь — в каком именно моменте возникает проблема?

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Antubas, может DAO.Recordset и спасет… Но мне об этом не ведомо. Я не профессиональный IT и к сожалению об DAO.Recordset пока ничего не знаю. Можете показать пример кода, я попробую

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

LVL, ну сейчас с запросами и получением (обменом) информации между файлами проблем нет. Есть другая проблема:

Почему при обновлении данных в файле Excel открывается другой файл, связанный с ним через запрос Access?

Есть файл данные_1.xlsx. Он связан с файлом данные_2.xlsx через запрос Access. Все файлы находятся в локальной сети. Подключение к базе данных Access в Excel идет по ссылке на сетевой диск Data Source=P:База…
При обновлении файла данные_1.xlsx на компьютере_1 происходит запуск на этом же компьютере файла данные_2.xlsx (в режиме для чтения), если он одновременно открыт на компьютере_2.
Если файл данные_2.xlsx закрыт, то обновление в файле данные_1.xlsx происходит без открытия связанного файла
Из-за чего так происходит и что сделать, что бы при обновлении файла данные_1.xlsx не запускался файл данные_2.xlsx

Можно ли решить эту проблему через настройку свойств подключения в Excel? В частности в настройке прав доступа:
Права доступа (Read — только чтение; ReadWrite — чтение и запись; Share Deny None — никому не отказывать ни в чтении, ни в записи; Share Deny Read — запретить всем работу в режиме чтения; Share Deny Write — запретить всем работу в режиме записи; Share Exclusive — запретить всем работу в режиме чтения/записи; Write — только запись).

Изменено: Ram-zes15.01.2015 14:43:28

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Когда я создавал эту тему, то хотел упростить (упорядочить) работу в Access, обнаружил в интернете информацию про прямое обращение к файлам Excel с помощью запросов из Access, но там не было информации о том, как делать такие запросы на диапазоны. Пока ждал помощи, сам разобрался с этими запросами, но вот появилась новая проблемы с обновлением данных (описал выше)

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

#14

15.01.2015 14:51:53

Цитата
Ram-zes пишет: пример кода
Код
Function status()
   Dim db As Database
   Dim rst As DAO.Recordset
   Dim strSQL As String
   Set db = CurrentDb
   strSQL = "SELECT [Лист1$].* FROM [Лист1$] IN '' [Excel 12.0;HDR=Yes;IMEX=1;DATABASE=С:База данныхФайл.xlsx];"
   Set rst = db.OpenRecordset(strSQL)
   rst.MoveFirst
   While Not rst.EOF
      rst.Fields("Столбец").Value
      rst.MoveNext
   Wend
   Set rst = Nothing
   rst.Close
End Function

Примерно так

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Да, совсем забыл, есть еще одно огромное преимущество у SQL запросов перед связанными таблицами. Вы знаете, что Access не берет более 255 столбцов…
В моем случае в файлах ведется учет рабочего времени и там создана шкала времени на весь год, т.е. более 360 столбцов. Если вы делаете связанную таблицу, то она возьмет в Access только первы 255 столбцов. Даже если вы создадите именованный диапазон на столбцы после 255 и попытаетесь создать связанную таблицу в Access на этот диапазон, то он ее не подцепит. А вот SQL запрос берет с этого листа любые диапазоны. В начале мне приходилось дублировать вторую половину года на отдельный лист и с него делать связанную таблицу, сейчас же все на одном листе

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Antubas, а вставляем этот код в SQL запрос? Я правильно понимаю, что вместо моего кода нужно вставить ваш?

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

Может выложите примерчик с Excel и Access файлом, или сходите на

http://www.cyberforum.ru/ms-access/

там помогут с Access.

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

#18

15.01.2015 15:03:51

Цитата
Ram-zes пишет: вставляем этот код в SQL запрос?

В VBA, лучше всего дайте файлы с примерами )

 

LVL

Пользователь

Сообщений: 903
Регистрация: 01.01.1970

#19

15.01.2015 15:04:20

Цитата
Ram-zes пишет: Access не берет более 255 столбцов…

Вы создаете таблицы в Access с таким количеством полей?

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

LVL, а куда деваться? Если нужно такое количество полей: 01.01 | 02.01 | 03.01 и т.д.

Antubas, с VBA не работаю, к сожалению…

Изменено: Ram-zes15.01.2015 15:08:07

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

У Вас база Access типа «Клиент»-«Сервер», или же Вы Access используете просто для операции БД?

Изменено: Antubas15.01.2015 15:08:14

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

видимо просто для операции БД

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

В принципе, выложить можно, но мне нужно ее подготовить для этого, только завтра

 

Antubas

Пользователь

Сообщений: 50
Регистрация: 22.10.2013

#24

15.01.2015 15:11:44

Цитата
Ram-zes пишет: операции БД

А почему бы тогда Вам не тратить время на Access и сделать все эти деления и обновления в самом Excel?

Цитата
только завтра

no problem

Изменено: Antubas15.01.2015 15:21:55

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

Вопрос в совместном доступе в Excel — не просто это сделать (ну мне не просто). Потребуется VBA. Ну или я не знаю адекватного способа

Изменено: Ram-zes15.01.2015 15:21:11

 

Ram-zes

Пользователь

Сообщений: 46
Регистрация: 18.11.2014

В общем решение оказалось простым. Нужен офис 2010 на всех компах и в свойствах подключения в правах доступа нужно указать: Share Deny None

 

zin-renat

Пользователь

Сообщений: 1
Регистрация: 24.07.2015

#27

24.07.2015 11:37:14

Добрый день. Ситуация такая. Имеется запрос из внешней базы данных MS SQL Server 2012, результат которого выводится в книгу Excel.

Код
select * from packs where packs.prday = 10

Как вместо цифры 10 подставить значение из ячейки листа Excel без использования VBA?

 

JeyCi

Пользователь

Сообщений: 3357
Регистрация: 27.11.2013

#28

24.07.2015 12:05:22

попробуйте так — при обновлении запроса должно выскочить окно — там и указать ячейку или др (см вроде бы в свойствах выходной таблицы — параметры)…

Код
select * from packs where packs.prday = [?]

или заново сформируйте параметрический (!) запрос через ms query…

см пост№23 здесь

p.s. и все запросы сваливать в эту ветку, наверно, не надо — лучше см.

Правила форума

— чуть что, я вас предупредила…

Изменено: JeyCi24.07.2015 12:10:08

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах)

Понравилась статья? Поделить с друзьями:
  • Excel sheet with password
  • Excel sheet with java
  • Excel sheet will not open
  • Excel sheet to pdf vba
  • Excel runtime error 5 invalid procedure call or argument