Интересный вопрос (постоянно используя их, но не думал о их точном значении). Определение оператора Imports
(то же самое для using
) довольно ясно: его единственная функция сокращает ссылки, удаляя соответствующие пространства имен. Таким образом, первый вопрос, задаваемый вопросом: имеет ли вообще VBA такую вещь (пространства имен)? И ответ - нет, поскольку вы можете читать из нескольких источников; Примеры: Ссылка 1 Ссылка 2
Итак, после того, как не было найдено ни одной ссылки на любой оператор VBA, делающий что-то похожее на Imports
/ using
и подтвердив, что VBA не рассматривает «структуру», оправдывающую их использование (пространства имен), я думаю, что я могу сказать: нет, в VBA такого не происходит.
Кроме того, вы должны иметь в виду, что у него не было бы реальной применимости. Например: при преобразовании кода VB.NET, где Imports
может использоваться, например:
Imports Microsoft.Office.Interop.Word
...
Dim wdApp As Application
, код будет полностью изменен, так что результирующая строка не будет длинной:
Dim wdApp As Word.Application ' Prefacing the library's display name.
Я думаю, что это хорошая графическая причина, объясняющая, почему VBA не нуждается в таких вещах: VB.NET учитывает самые разные реалии, которые должны быть должным образом классифицированы (пространства имен); VBA учитывает гораздо меньшее количество ситуаций и, следовательно, может позволить себе не выполнять столь систематическую, давно названную классификацию.
------------------ -------- CLARIFICATION
Imports
/ using
- простое сокращение имени, то есть вместо того, чтобы писать any.whatever2.whatever3 каждый раз, когда вы используете объект данного пространства имен в Module
/ Class
вы добавляете в начале инструкцию Imports
/ using
, которая в основном означает: «для всех членов пространства имен X просто забудьте обо всех заголовках bla, bla" ,
Я не говорю, что вы не можете эмулировать такое поведение; просто подчеркивая, что наличие встроенных функций для коротких имен имеет смысл в VB.NET, где имена могут стать очень длинными, но не так много в VBA.
После дня дальнейших испытаний я взломал его. Любой в будущем, ищущий решение для реализации Drive API Download с Flask, не стесняйтесь использовать мой код в качестве шаблона.
from __future__ import print_function
from flask import Flask, render_template, jsonify, request
import sys, requests, mimetypes
import pickle
import io
import os.path
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload, MediaFileUpload
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
@app.route('/drive_download')
def drive_download():
#CREDENTIALS
try:
SCOPES = ['https://www.googleapis.com/auth/drive']
##this might need to be swapped out to work with google picker authentication
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('client_secret.json', SCOPES) #Client_secret.json is what I called my credentials.json
creds = flow.run_local_server()
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
#DOWNLOAD FILE (I'm downloading a json file)
#Get file_id from AJAX call (this uses Picker to return the id of a file)
file_id = request.args.get("fileID")
drive_service = build('drive', 'v3', credentials=creds)
requests = drive_service.files().get_media(fileId = file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, requests)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100), file=sys.stderr)
fh.seek(0)
json = fh.read()
jsonRead = json.decode('utf-8') #decode from bytes into string
return jsonify(jsonRead) #Return file contents back to AJAX call
except Exception as e:
return(str(e))