記載予定

import textwrap
import pathlib
import google.generativeai as genai
from IPython.display import Markdown
from IPython.display import display
def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
# Used to securely store your API key
from google.colab import userdata
# Or use `os.getenv('GEMINI_API_KEY')` to fetch an environment variable.
GEMINI_API_KEY = userdata.get("GOOGLE_API_KEY")
genai.configure(api_key=GEMINI_API_KEY)
for m in genai.list_models():
    if "generateContent" in m.supported_generation_methods:
        print(m.name)
        model = genai.GenerativeModel("gemini-1.5-flash")
response = model.generate_content("茨城県の郷土料理にはどのようなものがありますか?")
to_markdown(response.text)

茨城県の郷土料理は、海産物と農産物が豊富に取れる土地柄を反映して、多様な料理があります。代表的なものをいくつか挙げると:

海産物を使った料理:

  • あんこう鍋: 茨城県はあんこうの水揚げ量が多いことで知られ、特に鹿島灘で獲れるあんこうを使ったあんこう鍋は有名です。濃厚なあん肝と、様々な野菜や豆腐などが入った、冬の定番料理です。
  • 涸沼のシジミを使った料理: 涸沼で獲れるシジミは、味噌汁や佃煮などに使われ、その旨味が人気です。シジミの味噌汁は、地元では定番の朝食として親しまれています。
  • 磯料理: 沿岸部では、新鮮な魚介類を使った刺身や寿司、焼き物などが多く食べられています。地域によって特色のある料理も多いでしょう。

農産物を使った料理:

  • 蕎麦: 茨城県は蕎麦の生産が盛んで、様々な種類の蕎麦が食べられます。特に、手打ち蕎麦のお店が多く、風味豊かな蕎麦が楽しめます。
  • いばらき地鶏を使った料理: 県内で飼育された「いばらき地鶏」は、肉質がしっかりとしていて、焼き鳥や鍋物など様々な料理に使われます。
  • 干し芋: 茨城県は干し芋の生産量が日本一です。ねっとりとした食感と甘さが特徴で、お土産としても人気です。
  • いもフライ: さつまいもを揚げたシンプルな料理ですが、茨城では定番のおやつとして親しまれています。

その他:

  • あんぱん: あんぱんの発祥の地であるとされる説があり、地元では様々な種類のあんぱんが販売されています。

これらの他にも、地域によって様々な郷土料理が存在します。例えば、筑波山周辺では山菜を使った料理も豊富です。 具体的な料理名は地域によって異なり、また、家庭料理なども含めるとさらに多様な料理が存在するでしょう。

このリストは代表的な例であり、網羅的なものではないことをご了承ください。 より詳細な情報を知りたい場合は、具体的な地域名や料理名で検索してみてください。

https://github.com/google/generative-ai-docs/blob/main/site/en/gemini-api/docs/get-started/python.ipynb

3.https://qiita.com/ksonoda/items/b9fd3e709aeae79629ff quiita 

ChatGPT】ファインチューニングをわかりやすく解説

本来、ニューラルネットワークのファインチューニングはtensorflowやkeras、pytorchといったライブラリを駆使してコードを書くかなり手間のかかる作業ですが、GPTだけでなく、LLMプロバイダが提供するLLMでは、このファインチューニングが非常に簡単に実行できるようになっています。

1.学習データの作成

まずは追加学習のデータを用意します。ファインチューニングに使うデータはちょうど、質問(prompt)と回答(completion)のようなセットから構成し、jsonlフォーマットで保存します。

        {"prompt": "LangChainとは何ですか?", "completion": "LangChain は、大規模言語モデルを使用してアプリケーションの作成を簡素化するように設計されたフレームワークです。"}

OpenAI社のマニュアルを見ると下記のように、このセットを少なくとも 10 個、通常50 ~ 100 個のトレーニング サンプルを用意せよとのことです。
と、さらっと書きましたがここが本当に大変なところ。。。本記事のようなデモであればちょっと面倒だなと感じる程度なのですが、実運用を考えるとかなりの工数とドメインナレッジを要する作業になることが容易に想像されます。ファインチューニングと言えど、機械学習。機械学習はデータを作るフェーズが結局は一番大変というのはLLMになっても変わらずというところでしょうか。。。

2.作成した学習データをアップロードする

openaiをインストール。

        !pip install openai

OpenAIのサイトで登録したAPI Keyをセットします。

        import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

作成したデータセット(sample.jsonl)をファインチューニング用にOpenAIのサイトにアップロードします。

        import json
import openai

# 学習用データのファイルパス
filepath = "/home/datascience/Langchain/sample.jsonl"

# アップロード
train_file = openai.File.create(
    file=open(filepath, "r"),
    purpose='fine-tune'
)

# 確認
print(train_file)

3.ファインチューニングの実行

アップロードされたデータを使って、ファインチューニングを実行するコードが下記。この例ではファインチューニングのベースとなるモデルは davinci を使っています。

        # ファインチューニング実行
job_finetune = openai.FineTune.create(
    training_file = train_file.id, model = 'davinci'
)

上記コードが実行されると、OpenAI社のサイトでファインチューンが実行されます。気をつけたい点としては、上記の処理の時点では、ファインチューンの実行を「予約しただけ」という状況です。つまり、コード実行後に直ぐにファインチューン処理が始まるわけではなく、待ち行列に並んだ状態だということです。

もちろん下記のように、ファインチューニングの処理のステイタスを確認することができます。

        from datetime import datetime

# ファインチューニングのステイタス確認
finetune_data = job_finetune.list().data
print(finetune_data)

以下のような出力になりファインチューニングに関する様々な情報を取得できます。(すごく長いので折り畳みます)

出力結果
                 

この出力ですと、非常にわかりにくいので必要な個所だけを抜き出してステイタスが簡単にわかるようにしてみます。

        from datetime import datetime

for i in range(len(job_finetune)):
    timestamp = finetune_data[i].created_at
    datetime = datetime.fromtimestamp(timestamp)
    fine_tuned_id = finetune_data[i].id
    status = openai.FineTune.retrieve(id=fine_tuned_id).status
    model = openai.FineTune.retrieve(id=fine_tuned_id).fine_tuned_model
    
    print(f'Queued : {datetime}')
    print(f'FineTune ID: {fine_tuned_id}')
    print(f'Model: {model}')
    print(f'Status: {status}\n')

結果、以下のような出力になります。
この出力は、既に4回のファインチューニングを実行した後のものです。マスクしていますが「ft-」で始まる文字列がファインチューンの処理IDや、そのモデルIDになります。

        Queued : 2023-08-04 10:21:19
FineTune ID: ft-ism9RTLGpLjtHpxxxxxxxx
Model: davinci:ft-personal-2023-08-04-12-58-34
Status: succeeded

Queued : 2023-08-14 13:31:54
FineTune ID: ft-Cim0w45IfLzoxxxxxxxxxxx
Model: davinci:ft-personal-2023-08-14-13-54-33
Status: succeeded

Queued : 2023-08-22 10:12:50
FineTune ID: ft-9rIJEbhQNQUk3xxxxxxxxxx
Model: davinci:ft-personal-2023-08-22-10-25-10
Status: succeeded

Queued : 2023-09-20 01:14:03
FineTune ID: ft-5auAZtej6YjOxxxxxxxxxxx
Model: None
Status: pending

この例では、始めの3つはsuceeededのステイタスとなっておりファインチューニングが完了した状態だということがわかります。そして4つ目はまさに待ち行列に並んでいる状態でステイタスがpendingとなっています。(この状態から3日待ってるけど処理が開始しないとブーブーいっている人たちが沢山いるようです。。。筆者の場合は、十数分後にはstartとなり、データ量も少ないため数分の処理でsucceededとなりました。)

RAG (Retrieval-Augmented Generation) は、大規模言語モデル (LLM) の能力を、外部の知識ベースから取得した情報を活用することで拡張する技術です。

簡単に言うと、LLMが質問に答える際に、自身の学習データだけでなく、関連性の高い外部情報を検索して回答の根拠とし、

より正確で最新の情報に基づいた回答を生成できるようにする仕組みです。

RAGの仕組み

RAGのプロセスは、大きく分けて以下の2つの段階で構成されます。

検索 (Retrieval):

ユーザーからの質問(クエリ)を受け取ります。

質問の意味やキーワードに基づいて、外部の知識ベース(文書、データベース、Webなど)から関連性の高い情報を検索・抽出します。

この検索には、キーワード検索や、質問と文書の意味的な類似性を評価するベクトル検索などの技術が用いられます。

生成 (Generation):

検索フェーズで抽出された関連情報と、ユーザーの元の質問を組み合わせて、LLMへの入力(プロンプト)を生成します。

LLMは、この拡張されたプロンプトに基づいて、質問に対する回答を生成します。回答の生成時には、検索された情報が根拠として活用されるため、

ハルシネーション(もっともらしい嘘)を減らし、事実に基づいた回答を生成しやすくなります。

RAGのメリット

回答の精度向上: 外部の信頼できる情報を根拠とするため、LLM単体よりも正確で具体的な回答が期待できます。

最新情報への対応: モデルを再学習することなく、外部の知識ベースを更新するだけで最新の情報に基づいた回答が可能になります。

ハルシネーションの低減: 回答の根拠となる情報が明示されるため、LLMが事実に基づかない情報を生成するリスクを減らせます。

特定の知識領域への対応: LLMが学習していない専門的な知識や社内情報などを活用して、質問に答えることができます。

説明可能性の向上: 回答の根拠となった情報を示すことができるため、ユーザーは回答の信頼性を判断しやすくなります。

学習コストの削減: モデル全体を再学習する必要がないため、コストを抑えられます。

RAGのデメリット

実装の複雑さ: 外部知識ベースとの連携や検索システムの構築が必要となるため、システムの実装が複雑になる場合があります。

検索の精度への依存: 検索フェーズで適切な情報を抽出できない場合、生成される回答の質も低下します。

応答時間の増加: 情報を検索するステップが追加されるため、LLM単体での応答よりも時間がかかる可能性があります。

知識ベースの管理: 外部知識ベースの品質維持や更新作業が必要です。

セキュリティリスク: 扱う情報によっては、アクセス制御などのセキュリティ対策が重要になります。

RAGは、LLMの持つ生成能力と、外部の豊富な知識を組み合わせることで、より実用的で信頼性の高いAIアプリケーションを開発するための重要な技術として注目されています。

PythonでChatGPTに質問を投げかけるには、OpenAIが提供しているAPIを利用する必要があります。直接的に「ChatGPT」という名前のAPIがあるわけではなく、GPT-3.5 TurboやGPT-4といった基盤モデルのAPIを通じて、ChatGPTと同様の対話機能を利用できます。

 

以下に、PythonでOpenAI APIを使ってChatGPTに質問を投げる基本的な手順とコード例を示します。

 

準備:

 

OpenAI APIキーの取得:

 

OpenAIのウェブサイト (https://platform.openai.com/) にアクセスし、アカウントを作成またはログインします。

APIキーのページ (https://platform.openai.com/api-keys) で新しいAPIキーを作成します。このキーは安全に保管し、コードに直接埋め込まないように注意してください(環境変数などを利用するのが推奨されます)。

OpenAI Pythonライブラリのインストール:

 

ターミナルまたはコマンドプロンプトで以下のコマンドを実行して、OpenAIのPythonライブラリをインストールします。

 

Bash

 

pip install openai

コード例:

 

Python

 

import openai

import os

 

# 環境変数からAPIキーを取得(推奨)

openai.api_key = os.environ.get("OPENAI_API_KEY")

 

# または、APIキーを直接記述(非推奨)

# openai.api_key = "YOUR_OPENAI_API_KEY"

 

def ask_chatgpt(prompt):

    """ChatGPTに質問を投げかけ、回答を得る関数"""

    try:

        response = openai.ChatCompletion.create(

            model="gpt-3.5-turbo",  # または "gpt-4" などの利用可能なモデル

            messages=[

                {"role": "user", "content": prompt}

            ]

        )

        return response.choices[0].message["content"]

    except openai.error.OpenAIError as e:

        print(f"OpenAI APIエラー: {e}")

        return None

 

if __name__ == "__main__":

    question = input("ChatGPTに質問を入力してください: ")

    answer = ask_chatgpt(question)

    if answer:

        print(f"ChatGPTの回答: {answer}")

コードの説明:

 

import openai: OpenAIのPythonライブラリをインポートします。

import os: 環境変数を扱うために os モジュールをインポートします。

openai.api_key = os.environ.get("OPENAI_API_KEY"): 環境変数 OPENAI_API_KEY からAPIキーを取得します。より安全な方法です。

openai.api_key = "YOUR_OPENAI_API_KEY": APIキーを直接コードに記述する方法(非推奨)。

ask_chatgpt(prompt) 関数:

質問(prompt)を引数として受け取ります。

openai.ChatCompletion.create() メソッドを使用してAPIにリクエストを送信します。

model: 使用するモデルを指定します。gpt-3.5-turbo は比較的安価で高速なモデルですが、より高性能な gpt-4 を利用することもできます(アクセス権が必要な場合があります)。

messages: メッセージのリストを指定します。ChatGPTは会話履歴を考慮するため、通常は複数のメッセージを含めることができます。ここでは、ユーザーの質問のみを含むシンプルな例です。

{"role": "user", "content": prompt}: ユーザーの役割と質問内容を指定します。

APIからのレスポンス(response)から、最初の回答(response.choices[0].message["content"])を抽出して返します。

APIエラーが発生した場合(例えば、APIキーが無効、リクエスト制限を超過など)、エラーメッセージを表示して None を返します。

if __name__ == "__main__": ブロック:

スクリプトが直接実行された場合にのみ実行されるコードです。

input() 関数でユーザーに質問を入力させます。

ask_chatgpt() 関数に質問を渡し、回答を取得します。

回答が存在する場合は、それを表示します。

実行方法:

 

上記のPythonコードを .py ファイル(例: chatgpt_ask.py) として保存します。

 

ターミナルまたはコマンドプロンプトを開き、保存したディレクトリに移動します。

 

環境変数 OPENAI_API_KEY を設定します。

 

macOS/Linux:

Bash

 

export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"

Windows (コマンドプロンプト):

Bash

 

set OPENAI_API_KEY=YOUR_OPENAI_API_KEY

Windows (PowerShell):

PowerShell

 

$env:OPENAI_API_KEY = "YOUR_OPENAI_API_KEY"

以下のコマンドを実行してスクリプトを実行します。

 

Bash

 

python chatgpt_ask.py

または

 

Bash

 

python3 chatgpt_ask.py

プロンプトが表示されたら、ChatGPTに質問を入力してEnterキーを押します。

 

ChatGPTからの回答が表示されます。

 

より高度な使い方:

 

会話履歴の管理: 複数の質問と回答を messages リストに含めることで、ChatGPTに文脈を理解させ、より自然な対話を実現できます。

システムの指示: {"role": "system", "content": "あなたは親切なアシスタントです。"} のように、システムの役割や振る舞いを指示するメッセージを最初に含めることができます。

パラメータの調整: temperature、max_tokens などのパラメータを調整することで、回答のランダム性や最大トークン数を制御できます。

OpenAI APIの利用には料金が発生しますので、料金体系をよく理解した上で利用してください。詳細は OpenAIのウェブサイトで確認できます。

 

 

 

 

 

 

phthonからgeminiに質問を投稿するには

 

 

PythonからGoogleのGeminiモデルに質問を投稿するには、Google Cloud AI PlatformのVertex AIにあるGemini API を利用します。直接的に「Gemini API」という名前の独立したAPIが存在するわけではありません。

 

以下に、PythonでVertex AI Gemini APIを使って質問を投稿し、回答を得る基本的な手順とコード例を示します。

 

準備:

 

Google Cloud Platform (GCP) プロジェクトの作成と設定:

 

GCPアカウントを持っていない場合は作成します。

新しいプロジェクトを作成します。

プロジェクトで Vertex AI API を有効にします。

認証情報の設定:

 

Vertex AI API を利用するための認証情報を作成します。推奨される方法は、サービスアカウントを作成し、その秘密鍵をダウンロードして利用する方法です。

秘密鍵のJSONファイルをPythonコードからアクセスできるように保存します。

Google Cloud Pythonクライアントライブラリのインストール:

 

ターミナルまたはコマンドプロンプトで以下のコマンドを実行して、Google Cloud AI PlatformのPythonクライアントライブラリをインストールします。

 

Bash

 

pip install google-cloud-aiplatform

コード例:

 

Python

 

import vertexai

from vertexai.generative_models import GenerativeModel, ChatModel, GenerationConfig

import os

 

# Google Cloud プロジェクトIDとリージョンを設定

PROJECT_ID = "your-gcp-project-id"  # ご自身のプロジェクトIDに置き換えてください

REGION = "asia-northeast1"  # 例: 東京リージョン

 

# サービスアカウントキーのパスを設定(環境変数から取得することを推奨)

CREDENTIALS_PATH = os.environ.get("GOOGLE_APPLICATION_CREDENTIALS")

if not CREDENTIALS_PATH:

    CREDENTIALS_PATH = "path/to/your/service_account_key.json"  # 実際のパスに置き換えてください

 

# Vertex AIの初期化

vertexai.init(project=PROJECT_ID, location=REGION, credentials_path=CREDENTIALS_PATH)

 

def ask_gemini(prompt):

    """Geminiモデルに質問を投げかけ、回答を得る関数"""

    try:

        model = GenerativeModel("gemini-pro")  # テキスト生成モデル

        # または、チャットモデルを使用する場合

        # chat_model = ChatModel("gemini-pro")

        # chat = chat_model.start_chat()

        # response = chat.send_message(prompt)

        # return response.text

 

        response = model.generate_content(prompt)

        return response.text

    except Exception as e:

        print(f"Vertex AI APIエラー: {e}")

        return None

 

if __name__ == "__main__":

    question = input("Geminiに質問を入力してください: ")

    answer = ask_gemini(question)

    if answer:

        print(f"Geminiの回答: {answer}")

コードの説明:

 

import vertexai: Vertex AIのPythonライブラリをインポートします。

from vertexai.generative_models import GenerativeModel, ChatModel, GenerationConfig: 必要なクラスをインポートします。

PROJECT_ID と REGION: ご自身のGCPプロジェクトIDと利用したいリージョンを設定します。

CREDENTIALS_PATH: サービスアカウントキーのJSONファイルのパスを設定します。環境変数 GOOGLE_APPLICATION_CREDENTIALS を利用することを強く推奨します。

vertexai.init(...): Vertex AIを初期化し、プロジェクトID、リージョン、認証情報を設定します。

ask_gemini(prompt) 関数:

質問(prompt)を引数として受け取ります。

GenerativeModel("gemini-pro"): テキスト生成に特化した gemini-pro モデルをインスタンス化します。

チャットモデル (ChatModel) を使用する場合 (より対話的な用途):

ChatModel("gemini-pro") でチャットモデルをインスタンス化します。

chat = chat_model.start_chat() で新しいチャットセッションを開始します。

response = chat.send_message(prompt) で質問を送信し、回答を得ます。

回答は response.text で取得できます。

テキスト生成モデル (GenerativeModel) を使用する場合 (単発の質問):

response = model.generate_content(prompt) で質問を送信し、回答を得ます。

回答は response.text で取得できます。

APIエラーが発生した場合、エラーメッセージを表示して None を返します。

if __name__ == "__main__": ブロック:

スクリプトが直接実行された場合にのみ実行されるコードです。

ユーザーに質問を入力させ、ask_gemini() 関数に渡して回答を取得し、表示します。

実行方法:

 

上記のPythonコードを .py ファイル(例: ask_gemini.py) として保存します。

 

ターミナルまたはコマンドプロンプトを開き、保存したディレクトリに移動します。

 

認証情報の設定:

 

推奨 (環境変数): 環境変数 GOOGLE_APPLICATION_CREDENTIALS にサービスアカウントキーのJSONファイルのパスを設定します。

 

Bash

 

export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/service_account_key.json"

または

 

Bash

 

set GOOGLE_APPLICATION_CREDENTIALS=path\to\your\service_account_key.json

直接指定 (非推奨): コード内の CREDENTIALS_PATH を実際のパスに置き換えます。

 

以下のコマンドを実行してスクリプトを実行します。

 

Bash

 

python ask_gemini.py

または

 

Bash

 

python3 ask_gemini.py

プロンプトが表示されたら、Geminiに質問を入力してEnterキーを押します。

 

Geminiからの回答が表示されます。

 

注意点:

 

課金: Vertex AIの利用には課金が発生します。料金体系をよく理解した上で利用してください。詳細は Google Cloud のドキュメントで確認できます。

リージョン: 利用可能な Gemini モデルのリージョンを確認し、適切なリージョンを設定してください。(例: asia-northeast1 は東京リージョンです)

モデルの選択: gemini-pro はテキストとコードの生成、チャットに適しています。画像に関する質問をしたい場合は、gemini-pro-vision モデルの利用を検討する必要があります。

エラーハンドリング: より堅牢なアプリケーションを作成するためには、より詳細なエラーハンドリングを追加することを推奨します。

この手順とコード例を参考に、PythonからGeminiモデルに質問を投稿してみてくださ

Sub Sheet変数取得()

Dim a As String

a = Range("F1")

Dim shn As String

shn = "Sheet2"

Dim wsn As String

 

 

If InStr(a, "Set") > 0 Then

   If InStr(a, shn) > 0 Then

     If InStr(a, "=") > 0 Then

     wsn = Left(a, InStr(a, "=") - 1)

     wsn = Replace(wsn, "Set", "")

     wsn = Trim(wsn)

     MsgBox wsn

   End If

End If

End If

 

 

End Sub

 

Sub 列gpt1()

    Dim ws As Worksheet

    Dim lastRow As Long

    Dim cell As Range

    Dim beforeText As String

    Dim afterText As String

    Dim p1 As String

    Dim a1 As String

    Dim p2 As String

    Dim a2 As String

    Dim E1 As String

    Dim B As Long

    Dim k As Long

    Dim a As String

    Dim Chr As String

    Dim Ary()

    Dim Len1a As Long  '(検出する文字列長さ)

    Dim Len1b As Long  'Rangeを含めた長さ

    Dim ichi As Long

    Dim char1 As String

'変更前あとはフォーム入力に従い事前に配列を作成しておく

'    'p1,a1  p2,a2 のセットを配列で用意しておいてループさせる

    p1 = "C"

    Len1a = Len(p1)  '検出する文字列の長さを取得

    p2 = "D"

    a1 = "G"

    a2 = "H"

    ' VBAコードを貼り付けたシートを指定

    Set ws = ThisWorkbook.Sheets("Sheet7") ' ★シート名を変更してください    

    ' 最終行を取得(コードがどこまであるか)

'    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

   '最終行ではなく最初のEnd Subまで

    ' 1列目(A列)をスキャンしながら文字列を置換

'    For Each cell In ws.Range("A1:A" & lastRow)⇒行でループ

'        If Not IsEmpty(cell.value) Then

    a = Range("A1").text

   'Nullでスキップ

    Chr = "Range(" & """" & p1 & ""

    Len1b = Len(Chr)

    B = 1

    k = -1

    Do

        B = InStr(B, a, Chr)

        If B > 0 Then

            k = k + 1

            ReDim Preserve Ary(4, k)

             ichi = B + Len1b - 1

             char1 = Mid(a, ichi + 1, 1)

              If Not char1 Like "[A-Z]" Then              

              'ここでさらに 取得した位置(Bの位置の1文字前が . であったなら

'                フラグを false にして

'                  さかのぼった位置に直接シート名があれば flg = True

'                 またはワークシート変数があればフラグオン

              '一文字前が .でなければ無条件実行

               フラグオンの処理

                Ary(0,k) = 行番号              

                Ary(1, k) = ichi

                Ary(2, k) = Len1a

                 Ary(3, k) = p2

            End If

        End If

        Debug.Print ichi

        B = B + 1

    Loop Until B = 1

    'この流れを Cellsとcolumnsで繰り返す

'    cellsとcolumnsは数字指定もある    

 Range("G1").Resize(3, 5) = Ary

'全ての行と位置が取得できたなら、その配列を読み込んで置換と色変更

End Sub

<!DOCTYPE html>

<html lang="ja">

<head>

  <meta charset="UTF-8">

  <title>CSSの関連付けの例</title>

  <link rel="stylesheet" href="style.css">

</head>

<body>

  <h1>これは見出しです</h1>

  <p>これは段落です。</p>

  <ul>

    <li>リスト1</li>

    <li>リスト2</li>

  </ul>

</body>

</html>

h1 {

  color: blue;

  font-size: 2em;

}

 

p {

  color: green;

  line-height: 1.5;

}

 

ul {

  list-style-type: square;

}

 

p {

  word-wrap: break-word; /* 単語の途中でも折り返す */

}

strong { font-weight: bold; /* または bolder, lighter, 数値など */

}

Bootstrapの主な特徴

 

レスポンシブデザイン: PC、スマートフォン、タブレットなど、様々なデバイスサイズに対応したWebサイトを簡単に作成できます。

豊富なコンポーネント: ボタン、フォーム、ナビゲーションバーなど、Webサイトでよく使われるUI部品が用意されており、

           HTMLにクラスを指定するだけで利用できます。

グリッドシステム: Webページのレイアウトを簡単に作成できるグリッドシステムが提供されています。

JavaScriptプラグイン: アニメーションやモーダルウィンドウなど、Webサイトに動きをつけるためのJavaScript

          プラグインが用意されています。

タイポグラフィ

カーニングとは、文字と文字の間のスペース、字間の調整をすることです。
        日本語では字詰めといいます。個別の単語内、

トラッキングは、行や段落全体の調整のことを言います。
        日本語では、字送りとも呼びます。

レディング   文字列の行送りのことで、いわゆる行間です

ウェイト    文字の太さ

ジャンプ率 隣接、または近い文字(たとえば大見出しと小見出しや本文)との文字のサイズの比率のこと。

均等割り付け

googlefontの取得

<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@200..900&display=swap" rel="stylesheet">

Noto Serif JP: 可変スタイルの CSS クラス

// <weight>: Use a value from 200 to 900 // <uniquifier>: Use a unique and descriptive class name
.noto-serif-jp-<uniquifier> { font-family: "Noto Serif JP", serif; font-optical-sizing: auto; font-weight: <weight>; font-style: normal;
}
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>自己紹介</title> <link href="https://fonts.googleapis.com/css?family=Kosugi+Maru|Noto+Serif+JP" rel="stylesheet"> <style> h1{ font-family: 'Kosugi Maru', sans-serif; } p{ font-family: 'Noto Serif JP', serif; } </style> </head> <body> <h1>六村リオ</h1> <p>趣味はプログラミングと食べることで、絵が壊滅的に下手。Pythonをこよなく愛する、明るい普通の女子高生。</p> </body> </html>

'<!DOCTYPE html>

'<html lang="ja">

'<head>

'    <meta chrrset = "UTF-8">

'</head>

'<body>

'    ハローワールド

'</body

'</html>

コメントは <!--   --> で囲む

 

Sub Macro1() '

 Dim rng As Range

    Dim height As Double

    Dim width As Double

    Dim shape1 As Shape

    Dim cel1 As Range, cel2 As Range

    Dim toppos1 As Double, toppos2 As Double, toppos3 As Double

    Dim leftpos1 As Double

    ' A1からD5の範囲を設定

    Set rng = Range(Cells(2, 1), Cells(2, 4))

    ' 高さと幅を取得

    height = rng.height  'ここで対象時間に従って高さを増減する

    width = rng.width

'    コピー先のtop とleftを取得

     Set cel1 = Cells(2, 7)

    ' TopとLeftの位置を取得

    toppos1 = cel1.Top

    leftpos1 = cel1.Left

    '次のセルの先頭位置を求める

  Set cel2 = Cells(3, 7)

 toppos2 = cel2.Top

 toppos3 = (toppos1 + toppos2) / 2

Set shape1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, leftpos1, toppos3, rng.width, rng.height)

End Sub

'vbaでA列にExcel日付形式で時間と分を 8:53と入れたとき、

'B列に整数で時刻を、C列に整数で分を表示するにはどうしたら

Sub 時間と分を分解1()

    Dim i As Long

    Dim MaxRow As Long

    Dim cellValue As Date

    Dim hour1 As Long

    Dim minute1 As Long

 

    ' 最終行を取得(A列を基準とする)

    MaxRow = Cells(Rows.Count, "A").End(xlUp).Row

 

    ' A列の各セルを処理

    For i = 1 To MaxRow

        ' A列のセル値を日付型に変換

        cellValue = Cells(i, "A").value

 

        ' 時間と分を抽出

        hour1 = Hour(cellValue)

        minute1 = Minute(cellValue)

 

        ' B列とC列に数値として代入

        Cells(i, "B").value = hour1

        Cells(i, "C").value = minute1

    Next i

End Sub

'これをExcelの関数として使用するには

Function 時間と分を分解2(セル As Range) As Variant

    Dim hour1 As Long

    Dim minute1 As Long

 

    ' セル値を日付型に変換

    hour1 = Hour(セル.value)

    minute1 = Minute(セル.value)

 

    ' 2要素の配列で返す

    時間と分を分解2 = Array(hour1, minute1)

End Function

Sub 重複削除とソート()

    Dim item As Variant

    Dim itx As Variant

    Dim i As Long, k As Long

    Dim Dict As Object

    ' 配列の初期化

  Dim strDate As String

    Dim intPos As Integer

    Dim Lary() As Double

    Dim Cary() As Double

    Dim Laryv As Variant

    Dim Caryv As Variant

   

     Set Dict = CreateObject("Scripting.Dictionary")

  For i = 2 To 8

 

    ' セルA1の値を文字列として取得

    strDate = Cells(i, 2)

 

    ' スペースの位置を検索(日付と時刻の区切りと仮定)

    intPos = InStr(strDate, " ")

 

    ' 日付部分だけを抽出

    If intPos > 1 Then

    strDate = Left(strDate, intPos - 1)

   End If

   strDate = Format(strDate, "m月d日")

   ' 配列の要素をCollectionに追加(重複は自動で排除)

    Dict(strDate) = ""

  Next

  Sheets("Sheet6").Select

  '現在のシートの1~20行目、A~J(10列目までのサイズを取得

  ReDim Lary(1 To 20)

  For i = 1 To 20

     Lary(i) = Cells(i, 1).Height

  Next

  Laryv = Lary

  

  ReDim Cary(1 To 10)

  For i = 1 To 10

  Cary(i) = Cells(1, i).ColumnWidth

  Next

  Caryv = Cary

   ReDim arr(Dict.Count - 1)

    i = 0

    For Each item In Dict.Keys

        arr(i) = item

        i = i + 1

    Next item

    

 Dim ws As Worksheet

For Each itx In arr

    ' "シート2"が存在するか確認

    On Error Resume Next ' エラーが発生しても処理を続行

    Set ws = Nothing

    Set ws = ThisWorkbook.Sheets(itx)

    On Error GoTo 0 ' エラー処理を解除

 

    ' シートが存在する場合

    If Not ws Is Nothing Then

        ws.Cells.ClearContents ' シートの内容をクリア

        ws.Activate

        Call p_copy(Laryv, Caryv)

    Else ' シートが存在しない場合

        Sheets.Add After:=Sheets(Sheets.Count) ' 末尾に新しいシートを追加

        ActiveSheet.Name = itx ' シート名を"シート2"に変更

        Call p_copy(Laryv, Caryv)

    End If

 Next

End Sub

 

Sub p_copy(Laryv, Caryv)

Dim i As Long, k As Long

For i = 1 To UBound(Laryv)

'MsgBox Laryv(1)

'ActiveSheet.Cells(i, 1).Height = Laryv(i)

 Range("A" & i).RowHeight = Laryv(i)

Next

For i = 1 To UBound(Caryv)

ActiveSheet.Cells(1, i).ColumnWidth = Caryv(i)

Next

End Sub

Sub ReIndentFormModule()

    Dim vbComp As VBComponent

    Dim codeMod As CodeModule

    Dim codeLines As String

    Dim lineNum As Long

    Dim formattedCode As String

    

    ' 対象のフォームモジュールを設定(例: "UserForm1")

    Set vbComp = ThisWorkbook.VBProject.VBComponents("UserForm1")

    Set codeMod = vbComp.CodeModule

    

    ' フォームのコード部分を取得

    codeLines = ""

    For lineNum = 1 To codeMod.CountOfLines

        codeLines = codeLines & codeMod.Lines(lineNum, 1) & vbCrLf

    Next lineNum

    

    ' 再インデント処理(例: 各行の先頭にスペースを追加)

    ' ※実際の再インデントロジックは必要に応じて変更してください

    formattedCode = ReIndentCode(codeLines)

    

    ' フォームのコード部分を上書き(デザイン情報は保持される)

    codeMod.DeleteLines 1, codeMod.CountOfLines ' 既存のコードを削除

    codeMod.AddFromString formattedCode ' 整形済みコードを追加

End Sub

 

' 再インデントのロジック(簡単な例としてスペースを追加)

Function ReIndentCode(ByVal code As String) As String

    Dim codeLines() As String

    Dim line As String

    Dim formattedLines As String

    Dim i As Long

    

    ' コードを行ごとに分割

    codeLines = Split(code, vbCrLf)

    formattedLines = ""

    

    ' 各行にインデントを追加

    For i = LBound(codeLines) To UBound(codeLines)

        line = codeLines(i)

        formattedLines = formattedLines & "    " & line & vbCrLf ' スペース4つのインデント

    Next i

    

    ReIndentCode = formattedLines

End Function

Sub 図形内の文字を取得()

    Dim shp As Shape

    Dim strText As String

 

    For Each shp In ActiveSheet.Shapes

        strText = shp.TextFrame.Characters.Text

        MsgBox shp.Name & "   " & strText

    Next shp

End Sub

Sub RenameDuplicateShapes()

    Dim shapeDict As Object

    Set shapeDict = CreateObject("Scripting.Dictionary")

    

    Dim ws As Worksheet

    Dim shp As Shape

    Dim originalName As String

    Dim newName As String

    Dim counter As Long

    

    ' アクティブシートを取得(必要に応じて特定のシートを指定してください)

    Set ws = ActiveSheet

    

    ' シート内のすべての図形に対して処理

    For Each shp In ws.Shapes

        originalName = shp.Name

        

        ' 既に存在する図形名である場合、名称を変更

        If shapeDict.Exists(originalName) Then

            counter = shapeDict(originalName) + 1

            newName = originalName & "_" & counter

            

            ' 新しい名前が既に存在するか確認し、存在する場合はさらにインクリメント

            Do While shapeDict.Exists(newName)

                counter = counter + 1

                newName = originalName & "_" & counter

            Loop

            

            ' 図形の名前を変更し、辞書に追加

            shp.Name = newName

            shapeDict.Add newName, 1

            shapeDict(originalName) = counter

        Else

            ' 新しい図形名として辞書に登録

            shapeDict.Add originalName, 1

        End If

    Next shp

    

    MsgBox "重複する図形名を修正しました。", vbInformation

End Sub

Option Explicit

 

Public WithEvents wb As Workbook          'この wbはAppEventClass の Set AppEvws1.wb = wb に対応

                                                              'この名前を合わせないと上記の文がエラーになる

'                               ’AppEvWs(このクラスモジュール名) ⇒ AppEvws1(そのインスタンス名)⇒をこで使われるWorkbook名(wb)と定義

'                               ’クラスモジュール間で引数をやり取りする方法

Private Sub Wb_SheetActivate(ByVal Sh As Object)      'App イベントのひとつ(シートチェンジ)

    ' フォームのShowFormメソッドを呼び出して、シート名を表示

    MsgBox wb.Name & " / " & Sh.Name

End Sub

 

'まとめ

'①

'    workbookopenかform Initiarize で Appイベントの使用を宣言

    'Private Sub Workbook_Open()

    '    ' Applicationオブジェクトのイベントを有効化

    '    ' VBAが異常終了するとこの文は無効になるのでできたら他で(フォームの立ち上げとか)で宣言した方が好ましい

    '    Application.EnableEvents = True

    '    ' WorkbookActivateイベントを監視するためにイベントを有効化

    '    Set AppEvHandl = New AppEventClass     'Setの次の項目は標準モジュールで Public AppEvHandl As New AppEventClass のように定義する

    '                                                                  'New の次の項目はこのイベントを扱うクラスモジュール名

    '

    'End Sub

'②標準モジュール先頭に  クラスモジュールのインスタンスを作成

'    Public AppEvHandl As New AppEventClass

'③ActiveWorkbookが変わった時のクラスモジュール ここではAppEventClassを作成する

    '  その内容

    'Public WithEvents App As Application      '定型文

    'Private AppEvws1 As AppEvWs              '左辺AppEvWsのインスタンス名 右辺はシートチェンジを扱うクラスモジュール名

    '

    'Private Sub Class_Initialize()

    '    Set App = Application                '定型文

    'End Sub

    'Private Sub App_WorkbookActivate(ByVal wb As Workbook)        'Appイベントのひとつ ActiveWorkbookが替わったときにイベントが発生する

    ' If wb.Name <> ThisWorkbook.Name Then                                    'この場合アプリの仕様上自身のワークブック選択時は除外している

    '        Set AppEvws1 = New AppEvWs                                              '左辺AppEvWs のインスタンス'

    '        Set AppEvws1.wb = wb                                                        'AppEvWsの中で使われるworkbook名を代入(wbはこのプロシージャの ws As Workbookで引数として

    '                                                                                                  'App から受け取っている

    '        Dim activeSheetName As String

    '        activeSheetName = wb.ActiveSheet.Name                              'wbのActiveSheet名 このくだりを書かないとActiveBookが替わった時のそのシート名を取得できない

    '         MsgBox wb.Name & " / " & ActiveSheet.Name

    ' End If

    ''End Sub

'④シートチェンジしたときのイベントをとらえるクラスモジュール AppEvWs を作成する

'  上記文

 

 Option Explicit

 Public IsUpdatingListBox As Boolean

Private Sub ListBox1_Click()

    If Not IsUpdatingListBox Then

        With ListBox1

            TextBox1 = .List(.ListIndex, 0)

            TextBox2 = .List(.ListIndex, 1)

        End With

    End If

End Sub

 

Private Sub CommandButton2_Click()

    IsUpdatingListBox = True ' フラグを立てる

    With ListBox1

        .List(.ListIndex, 0) = TextBox1

        .List(.ListIndex, 1) = TextBox2

    End With

    IsUpdatingListBox = False ' フラグを戻す

End Sub

 

Sub B010_02B()

    Dim dic1 As Object

    Set dic1 = CreateObject("Scripting.dic1ionary")

    Dim i As Long

 

    ' クラスモジュールをインスタンス化 (クラスモジュール名は適宜変更)

    Dim objCustomer As Customer

 

    ' 取引先データを連想配列に格納

        For i = 2 To 6

            Set objCustomer = New Customer

            With objCustomer

                .取引先名 = Cells(i, "K").Value

                .取引先郵便番号 = Cells(i, "L").Value

                .取引先住所 = Cells(i, "M").Value

            End With

            dic1.Add Key:=Cells(i, "J").Value, Item:=objCustomer

        Next i

          

        For i = 2 To 4

            If dic1.Exists(Cells(i, "B").Value) Then

                With dic1(Cells(i, "B").Value)

                    Cells(i, "C").Value = .取引先名

                    Cells(i, "D").Value = .取引先郵便番号

                    Cells(i, "E").Value = .取引先住所

                End With

            End If

        Next i

    

End Sub

 

 

Private p_取引先名 As String

Private p_取引先郵便番号 As String

Private p_取引先住所 As String

'オブジェクトのプロパティに値を代入するときに使用します。

Public Property Let 取引先名(ByVal Value As String)

    p_取引先名 = Value

End Property

'オブジェクトのプロパティの値を取得するときに使用します 呼ばれるとクラスオブジェクト内の該当項目を返す

Public Property Get 取引先名() As String

    取引先名 = p_取引先名

End Property

Public Property Let 取引先郵便番号(ByVal Value As String)

    p_取引先郵便番号 = Value

End Property

Public Property Get 取引先郵便番号() As String

    取引先郵便番号 = p_取引先郵便番号

End Property

Public Property Let 取引先住所(ByVal Value As String)

    p_取引先住所 = Value

End Property

Public Property Get 取引先住所() As String

    取引先住所 = p_取引先住所

End Property

 

Sub B010_02C()

    Dim dic1 As Object

    Dim 取引先名 As String

    Dim 取引先郵便番号 As String

    Dim 取引先住所 As String

    Dim i As Long

    Set dic1 = CreateObject("Scripting.dictionary")

 

    ' クラスモジュールをインスタンス化 (クラスモジュール名は適宜変更)

    Dim cust As Custom2A

'     取引先データを連想配列に格納

    For i = 2 To 6

            取引先名 = Cells(i, "K").Value

            取引先郵便番号 = Cells(i, "L").Value

            取引先住所 = Cells(i, "M").Value

        

            Set cust = New Custom2A

            cust.p_取引先名2 = 取引先名

            cust.p_取引先郵便番号2 = 取引先郵便番号

            cust.p_取引先住所2 = 取引先住所

            dic1.Add Key:=Cells(i, "J").Value, Item:=cust

        Next i

          

        For i = 2 To 4

            If dic1.Exists(Cells(i, "B").Value) Then

                Set cust = dic1(Cells(i, "B").Value)

                Cells(i, "C").Value = cust.p_取引先名2

                Cells(i, "D").Value = cust.p_取引先郵便番号2

                Cells(i, "E").Value = cust.p_取引先住所2

            End If

        Next i    

End Sub

Option Explicit

 

Public p_取引先名2 As String

Public p_取引先郵便番号2 As String

Public p_取引先住所2 As String

' ProcedureInfoクラスモジュール
Public Name As String
Public StartLine As Long
Public EndLine As Long
Public Calls As Collection
 
Private Sub Class_Initialize()
    Set Calls = New Collection
End Sub
 
 
 
ub AnalyzeProcedures()
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim procDict As Object
    Dim i As Long, j As Long
    Dim procName As String, startLine As Long, endLine As Long
    Dim procInfo As ProcedureInfo
 
    Set ws1 = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")
    Set ws3 = ThisWorkbook.Sheets("Sheet3")
    Set procDict = CreateObject("Scripting.Dictionary")
 
    ' Sheet2からプロシージャ情報を読み込む
    For i = 2 To ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
        procName = ws2.Cells(i, 1).Value
        startLine = ws2.Cells(i, 2).Value
        endLine = ws2.Cells(i, 3).Value
 
        Set procInfo = New ProcedureInfo
        procInfo.Name = procName
        procInfo.StartLine = startLine
        procInfo.EndLine = endLine
 
        procDict.Add procName, procInfo
    Next i
 
    ' プロシージャの呼び出し関係を解析
    For Each procName In procDict.Keys
        Set procInfo = procDict(procName)
        For j = procInfo.StartLine To procInfo.EndLine
            If InStr(ws1.Cells(j, 1).Value, "Call ") > 0 Then
                Dim calledProc As String
                calledProc = Trim(Split(ws1.Cells(j, 1).Value, "Call ")(1))
                If procDict.Exists(calledProc) Then
                    procInfo.Calls.Add procDict(calledProc)
                End If
            End If
        Next j
    Next procName
 
    ' ネスト構造をSheet3に出力
    ws3.Cells.Clear
    Dim row As Long
    row = 1
    For Each procName In procDict.Keys
        Set procInfo = procDict(procName)
        Call WriteProcedure ws3, procInfo, row, 0
    Next procName
End Sub
 
Sub WriteProcedure(ws As Worksheet, procInfo As ProcedureInfo, ByRef row As Long, indent As Long)
    ws.Cells(row, 1).Value = String(indent * 2, " ") & procInfo.Name
    row = row + 1
    Dim calledProc As ProcedureInfo
    For Each calledProc In procInfo.Calls
        Call WriteProcedure(ws, calledProc, row, indent + 1)
    Next calledProc
End Sub

' OneDriveフォルダのFileSystemObjectを取得

Set fso = CreateObject("Scripting.FileSystemObject")

 

' ファイルの存在を確認

strFilePath = fso.GetSpecialFolder(SHFOLDER_LOCAL_APPDATA) & "\Microsoft\OneDrive\test.xlsx"

If Not fso.FileExists(strFilePath) Then

    ' ファイルが存在しない

    MsgBox "ファイルが存在しません。"

Else

    ' ファイルが存在する

    ' ファイルの属性情報を確認

    Set fsoFile = fso.GetFile(strFilePath)

    If fsoFile.Attributes And vbReadOnly Then

        ' ファイルが開けない

        MsgBox "ファイルが開けません。(アクセス権不足)"

    Else

        ' ファイルを開ける

        Workbooks.Open strFilePath

    End If

End If

Sub ABC3()

'B,C,D,E で合成キーを作成 但し、C2桁 D2桁 E 1桁とする

Dim i, L1, L2, LMax As Long

'文字列の最大列数を求める

For i = 2 To 5

L1 = Len(Cells(i, "B"))

If LMax < L1 Then LMax = L1

Next

For i = 2 To 5

L2 = Len(Cells(i, "B"))

Cells(i, "G") = Cells(i, "B") & String(LMax - L2 + 1, " ") & Right("00" & Cells(i, "C"), 2) & _

" " & Right("00" & Cells(i, "D"), 2) & " " & Right("0" & Cells(i, "E"), 1)

Next

Range("G:G").Font.Name = "Consolas"

End Sub

 

 

Sub atest2()

Dim sizea As Long

Dim fonta As String

Dim chlen As Long

Dim slflg As Boolean

Dim cnam As Variant

Dim color1 As Variant

Dim maru As Double

ActiveSheet.Shapes.Range(Array("四角形: 角を丸くする 1")).Select

cnam = Selection.ShapeRange.TextFrame.Characters.Text   'コピー元の文字を取得

chlen = Len(cnam)

With Selection.ShapeRange.TextFrame2.TextRange

    sizea = .Font.Size    'コピー元のフォントサイズを取得

    fonta = .Font.Name       'コピー元のフォント名を取得

End With

With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, 1).Font

    slflg = .Bold    'コピー元が太字かどうか取得

    color1 = .Fill.ForeColor.RGB    'コピー元の色を取得

 End With

 If Selection.Name Like "*四角形: 角を丸くする*" Or Selection.Name Like "*Rounded Rectangle*" Then

   maru = Selection.ShapeRange.Adjustments.Item(1)

 End If

 

ActiveSheet.Shapes.Range(Array("四角形: 角を丸くする 2")).Select        'コピー先文字のプロパディを設定

If Selection.Name Like "*四角形: 角を丸くする*" Or Selection.Name Like "*Rounded Rectangle*" Then

Selection.ShapeRange.Adjustments.Item(1) = maru  '角の丸さを設定

End If

 

Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = cnam     'コピー元の文字を貼り付け

Selection.ShapeRange.TextFrame2.TextRange.Font.Size = sizea                     'コピー元のフォントサイズを適用

With Selection.ShapeRange.TextFrame2.TextRange.Font                'コピー元のフォント名を適用

    .NameComplexScript = fonta

    .NameFarEast = fonta

    .Name = fonta

End With

    

With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, chlen).Font     'コピー先文字のプロパディを適用

    .Fill.Visible = msoTrue

    .Fill.ForeColor.RGB = color1    'コピー先文字の色を適用

    If slflg = True Then .Bold = msoTrue       'コピー先文字の太さを適用

End With

End Sub

範囲内の図形選択

Sub Getshape1()

Dim i As Long

Dim shp As Shape

Dim Range1 As Range

Dim Range2 As Range

Dim ary1()

Set Range1 = Selection

For Each shp In Range1.Worksheet.Shapes

    Set Range2 = Range(shp.topleftcell, shp.bottomRightCell)

    If Not Intersect(Range2, Range1) Is Nothing Then

        If Intersect(Range2, Range1).Address = Range2.Address Then

            i = i + 1

            ReDim Preserve ary1(i)

            ary1(i) = shp.Name

        End If

    End If

Next

ActiveSheet.Shapes.Range(ary1).Select

 

End SubSub Getshape1()

Dim i As Long

Dim shp As Shape

Dim Range1 As Range

Dim Range2 As Range

Dim ary1()

Set Range1 = Selection

For Each shp In Range1.Worksheet.Shapes

    Set Range2 = Range(shp.topleftcell, shp.bottomRightCell)

    If Not Intersect(Range2, Range1) Is Nothing Then

        If Intersect(Range2, Range1).Address = Range2.Address Then

            i = i + 1

            ReDim Preserve ary1(i)

            ary1(i) = shp.Name

        End If

    End If

Next

ActiveSheet.Shapes.Range(ary1).Select

End Sub

Sub 図形名分割2(図形名 As Variant)   'name3とnama2はpublic定義の必要あり 図形内文字分割

Dim ar5()

Dim i, leng1, leng2 As Long

Dim 結果

Dim s_flg As Long

 

leng1 = Len(図形名)

'図形名を1文字ずつ分解する

For i = 1 To leng1

ReDim Preserve ar5(2, i)

'1行目に図形名 2行目に文字数字区分(数字 0 文字 1)

ar5(1, i) = Mid(図形名, i, 1)

If IsNumeric(ar5(1, i)) Then

ar5(2, i) = 0

Else

ar5(2, i) = 1

End If

Next

 

leng2 = 0    'leng2 は文字数の数

For i = 1 To leng1

leng2 = leng2 + 1

If ar5(2, i) = 0 Then Exit For

Next

If leng2 <> leng1 Then

name2 = Left(図形名, leng2 - 1)

Else

name2 = 図形名

End If

 

MsgBox name2 & " GG"

name3 = Right(図形名, leng1 - leng2 + 1)

 

 

End Sub

Private Sub 図形連番コピー_Click()

Dim ar3()

Dim i, k As Long

Dim digit1, digit2, digit3 As Long 'digit1 元の図形内数字の桁数、digit2演算後の桁数

Dim ar5()

Dim shp As Shape

Dim shp_n As String

Dim moji1 As String

Dim top1, top2, left1, height1, intaval1 As Double

 

Dim count, name2v As Long

intaval1 = 20

 Dim ゼロ詰め後 As String

count = InputBox("コピー回数")

 

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange '実際は一回しかループしない

shp_n = shp.Name

top1 = shp.Top

left1 = shp.Left

height1 = shp.Height

Next

name2v = Val(name2)

ReDim ar5(count)

moji1 = ActiveSheet.Shapes(shp_n).TextFrame.Characters.Text  'テキスト内文字取得

Call 図形名分割2(moji1)      '文字を 分割 name2 テキスト内文字列 文字部分 name3  テキスト内文字列 数字部分

digit1 = Len(name3)

k = Val(name3)

For i = 1 To Val(count)

If k <> 0 Then

k = k + 1

'最初の桁数に連番が収まるようにする処理

digit2 = Len(CStr(k))

digit3 = digit1 - digit2

    ' 条件によって桁数を制御

    If digit3 = 3 Then

        ゼロ詰め後 = "000" & k

    ElseIf digit3 = 2 Then

        ゼロ詰め後 = "00" & k

    ElseIf digit3 = 1 Then

        ゼロ詰め後 = "0" & k

    Else

        ゼロ詰め後 = CStr(k) '

    End If

ar5(i) = name2 & ゼロ詰め後   '編集後テキスト内文字

Else

ar5(i) = name2

End If

Next

Range("c5:e15") = ar5

'実際の図形のコピー処理

For i = 1 To Val(count)

 

 ActiveSheet.Shapes.Range(Array(shp_n)).Select

    Selection.Copy

    ActiveSheet.Paste

    '図形内文字列の編集

    Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = ar5(i)

    Selection.Left = left1

    top2 = top1 + ((intaval1 + height1) * i)

    Selection.Top = top2

    DoEvents

Next

 

End Sub

Sub バブルソート(ByRef argAry() As Variant, ByVal keyPos As Long)

    Dim vSwap

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    For i = LBound(argAry, 1) To UBound(argAry, 1)

        For j = LBound(argAry) To UBound(argAry) - 1

            If argAry(j, keyPos) > argAry(j + 1, keyPos) Then

                For k = LBound(argAry, 2) To UBound(argAry, 2)

                    vSwap = argAry(j, k)

                    argAry(j, k) = argAry(j + 1, k)

                    argAry(j + 1, k) = vSwap

                Next

            End If

        Next j

    Next i

 

End Sub

Sub 罫線シフト()

 Dim kb As Long

 Dim flg1 As String

 Dim i, sen1, sen2, wht1, wht2 As Long

 Dim strow, edrow, CurrentRow, stcol As Long

 Dim targetcell As Range

 Dim target, topleftcell As Range

 Dim kb2 As Object

 Set target = Selection

 If Not target Is Nothing Then  '何かしたセルが選択されているとき

    Set topleftcell = target.Cells(1, 1)   ' 左上のセルを取得

    stcol = topleftcell.Column      ' 左上のセルの列

    strow = topleftcell.Row          '左上のセルの行

 

    edrow = topleftcell.SpecialCells(xlCellTypeLastCell).Row    'その列の最大行(文字なしを含む)

    Set targetcell = topleftcell        'targetcellはoffsetで変動させる

    If targetcell.Borders(xlEdgeRight).LineStyle <> xlNone Then

        flg1 = "R"

    Else

        If targetcell.Borders(xlEdgeLeft).LineStyle <> xlNone Then

            flg1 = "L"

        End If

    End If

    If flg1 = "" Then Exit Sub

    sen1 = targetcell.Borders(xlEdgeLeft).LineStyle      '計算のプロパティを取得

    sen2 = targetcell.Borders(xlEdgeRight).LineStyle

    wht1 = targetcell.Borders(xlEdgeLeft).Weight

    wht2 = targetcell.Borders(xlEdgeRight).Weight

    

    CurrentRow = strow

    For i = strow To edrow      '1セルずつ下にたどり罫線の続いている最下行を求める

      Set targetcell = targetcell.Offset(1, 0)

      If flg1 = "L" Then

          If targetcell.Borders(xlEdgeLeft).LineStyle <> xlNone Then

             CurrentRow = CurrentRow + 1

          Else

            Exit For

          End If

      End If

      If flg1 = "R" Then

         If targetcell.Borders(xlEdgeRight).LineStyle <> xlNone Then

             CurrentRow = CurrentRow + 1

          Else

             Exit For

          End If

      End If

      If flg1 = "" Then Exit For

    Next

Else

    MsgBox "セルが選択されていません。"

    Exit Sub

End If

kb = 2    '右シフトを選択  kb=1 なら左シフト

Range(Cells(strow, stcol), Cells(CurrentRow, stcol)).Select

If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = xlNone      '罫線削除

If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = xlNone

If kb = 1 Then      '左シフトの場合

    Range(Cells(strow, stcol - 1), Cells(CurrentRow, stcol - 1)).Select

    If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = sen1

     If flg1 = "L" Then Selection.Borders(xlEdgeLeft).Weight = wht1

    If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = sen2

     If flg1 = "R" Then Selection.Borders(xlEdgeRight).Weight = wht2 '

Else          '右シフトの場合

   Range(Cells(strow, stcol + 1), Cells(CurrentRow, stcol + 1)).Select

   If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = sen1

    If flg1 = "L" Then Selection.Borders(xlEdgeLeft).Weight = wht1

   If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = sen2

    If flg1 = "R" Then Selection.Borders(xlEdgeRight).Weight = wht2

End If

End Sub

 

Sub 図形名分割(図形名 As Variant)  'name3とnama2はpublic定義の必要あり

Dim ar5()

Dim i, leng1, leng2 As Long

Dim 結果

leng1 = Len(図形名)

Dim name1

For i = 1 To leng1

ReDim Preserve ar5(2, i)

ar5(1, i) = Mid(図形名, i, 1)

If IsNumeric(ar5(1, i)) Then

ar5(2, i) = 0

Else

ar5(2, i) = 1

End If

Next

 

leng2 = 0

For i = 1 To leng1

leng2 = leng2 + 1

If ar5(2, i) = 0 Then Exit For

Next

name1 = Left(図形名, leng2 - 2)

name2 = Right(図形名, leng1 - leng2 + 1)

name3 = dic_x(name1)

name3 = name3 & " " & name2

End Sub

 

Sub 配列作成()    '英文図形名を和文に変換する連想配列を作成する

Dim 図形名本体 As String, 図形名連番 As String

Dim ar11, ar12

Dim i As Long

'Dim dic_x As Object    'dic_x はグローバルまたはpublic変数として登録しておく

Set dic_x = CreateObject("scripting.dictionary")

 

ar11 = Array("Straight Connector", "Straight Arrow Connector", "Elbow Connector", "Curved Connector", "Freeform", _

"Rectangle", "Rounded Rectangle", "Snip Single Corner Rectangle", "Snip Same Side Corner Rectangle", "Snip Diagonal Corner Rectangle", _

"Snip and Round Single Corner Rectangle", "Round Single Corner Rectangle", "Round Same Side Corner Rectangle", _

"Round Diagonal Corner Rectangle", "TextBox", "Oval", "Isosceles Triangle", "Right Triangle", "Parallelogram", "Trapezoid ", "Diamond", _

"Regular Pentagon", "Hexagon", "Heptagon", "Octagon", "Decagon", "Dodecagon", "Pie", "Chord", "Teardrop", "Frame", "Half Frame", _

"L-Shape", "Diagonal Stripe", "Cross", "Plaque", "Can", "Cube", "Bevel", "Donut", "No Symbol", "Block Arc", "Folded Corner", "Smiley Face", _

"Heart", "Lightning Bolt", "Sun", "Moon", "Cloud", "Arc", "Double Bracket", "Double Brace", "Left Bracket", "Right Bracket", "Left Brace", _

"Right Brace", "Right Arrow", "Left Arrow", "Up Arrow", "Down Arrow", "Left-Right Arrow", "Up-Down Arrow", "Quad Arrow", _

"Left-Right-Up Arrow", "Bent Arrow", "U-Turn Arrow", "Left-Up Arrow", "Bent-Up Arrow", "Curved Right Arrow", "Curved Left Arrow", _

"Curved Up Arrow", "Curved Down Arrow", "Striped Right Arrow", "Notched Right Arrow", "Pentagon", "Chevron", "Right Arrow Callout", _

"Down Arrow Callout", "Left Arrow Callout", "Up Arrow Callout", "Left-Right Arrow Callout", "Quad Arrow Callout", "Circular Arrow", "Plus", "Minus", _

"Multiply", "Division", "Equal", "Not Equal", "Flowchart: Process", _

"Flowchart: Alternate Process", "Flowchart: Decision", "Flowchart: Data", "Flowchart: Predefined Process", "Flowchart: Internal Storage", _

"Flowchart: Document", "Flowchart: Multidocument", "Flowchart: Terminator", "Flowchart: Preparation", "Flowchart: Manual Input", _

"Flowchart: Manual Operation", "Flowchart: Connector", "Flowchart: Off-page Connector", "Flowchart: Card", "Flowchart: Punched Tape", _

"Flowchart: Summing Junction", "Flowchart: Or", "Flowchart: Collate", "Flowchart: Sort", "Flowchart: Extract", _

"Flowchart: Merge", "Flowchart: Stored Data", "Flowchart: Delay", "Flowchart: Sequential Access Storage", "Flowchart: Magnetic Disk", _

"Flowchart: Direct Access Storage", "Flowchart: Display", "Explosion 1", "Explosion 2", "4-Point Star", _

"5-Point Star", "6-Point Star", "7-Point Star", "8-Point Star", "10-Point Star", "12-Point Star", "16-Point Star", "24-Point Star", _

"32-Point Star", "Up Ribbon", "Down Ribbon", "Curved Up Ribbon", "Curved Down Ribbon", "Vertical Scroll", "Horizontal Scroll", _

"Wave", "Double Wave", "Double Wave", "Rounded Rectangular Callout", "Oval Callout", "Cloud Callout", "Line Callout 1", _

"Line Callout 2", "Line Callout 3", "Line Callout 1 (Accent Bar)", "Line Callout 2 (Accent Bar)", "Line Callout 3 (Accent Bar)", _

"Line Callout 1 (No Border)", "Line Callout 2 (No Border)", "Line Callout 3 (No Border)", "Line Callout 1 (Border and Accent Bar)", _

"Line Callout 2 (Border and Accent Bar)", "Line Callout 3 (Border and Accent Bar)", "Group")

 

ar12 = Array("直線コネクタ", "直線矢印コネクタ", "コネクタ: カギ線", "コネクタ: 曲線", "フリーフォーム: 図形", _

 "正方形/長方形", "四角形: 角を丸くする", "四角形: 1 つの角を切り取る", "四角形: 上の 2 つの角を切り取る", "四角形: 対角を切り取る", _

 "四角形: 1 つの角を切り取り 1 つの角を丸める", "四角形: 1 つの角を丸める", "四角形: 上の 2 つの角を丸める", "四角形: 対角を丸める", "テキスト ボックス", _

"楕円", "二等辺三角形", "直角三角形", "平行四辺形", "台形", _

"ひし形", "五角形", "六角形", "七角形", "八角形", "十角形", "十二角形", "部分円", "弦", "涙形", _

"フレーム", "フレーム (半分)", "L 字", "斜め縞", "十字形", "ブローチ", "円柱", "直方体", "四角形: 角度付き", "円: 塗りつぶしなし", _

"禁止マーク", "アーチ", "四角形: メモ", "スマイル", "ハート", "稲妻", "太陽", "月", "雲", "円弧", _

"大かっこ", "中かっこ", "左大かっこ", "右大かっこ", "左中かっこ", "右中かっこ", "矢印: 右", "矢印: 左", "矢印: 上", "矢印: 下", _

"矢印: 左右", "矢印: 上下", "矢印: 四方向", "矢印: 三方向", "矢印: 折線", "矢印: U ターン", "矢印: 二方向", "矢印: 上向き折線", "矢印: 右カーブ", "矢印: 左カーブ", _

"矢印: 上カーブ", "矢印: 下カーブ", "矢印: ストライプ", "矢印: V 字型", "矢印: 五方向", "矢印: 山形", "吹き出し: 右矢印", "吹き出し: 下矢印", "吹き出し: 左矢印", "吹き出し: 上矢印", _

"吹き出し: 左右矢印", "吹き出し: 四方向矢印", "矢印: 環状", "加算記号", "減算記号", "乗算記号", "除算記号", "次の値と等しい", "等号否定", "フローチャート: 処理", _

"フローチャート: 代替処理", "フローチャート: 判断", "フローチャート: データ", "フローチャート: 定義済み処理", "フローチャート: 内部記憶", "フローチャート: 書類", "フローチャート: 複数書類", "フローチャート: 端子", "フローチャート: 準備", "フローチャート: 手操作入力", _

"フローチャート: 手作業", "フローチャート: 結合子", "フローチャート: 他ページ結合子", "フローチャート: カード", "フローチャート: せん孔テープ", "フローチャート: 和接合", "フローチャート: 論理和", "フローチャート: 照合", "フローチャート: 分類", "フローチャート: 抜出し", _

"フローチャート: 組合せ", "フローチャート: 記憶データ", "フローチャート: 論理積ゲート", "フローチャート: 順次アクセス記憶", "フローチャート: 磁気ディスク", "フローチャート: 直接アクセス記憶", "フローチャート: 表示", "爆発: 8 pt", "爆発: 14 pt", "星: 4 pt", _

"星: 5 pt", "星: 6 pt", "星: 7 pt", "星: 8 pt", "星: 10 pt", "星: 12 pt", "星: 16 pt", "星: 24 pt", "星: 32 pt", "リボン: 上に曲がる", _

"リボン: 下に曲がる", "リボン: カーブして上方向に曲がる", "リボン: カーブして下方向に曲がる", "スクロール: 縦", "スクロール: 横", "波線", "小波", "吹き出し: 四角形", "吹き出し: 角を丸めた四角形", "吹き出し: 円形", _

"思考の吹き出し: 雲形", "吹き出し: 線", "吹き出し: 折線", "吹き出し: 2 つ折線", "吹き出し: 線 (強調線付き)", "吹き出し: 折線 (強調線付き)", "吹き出し: 2 つ折線 (強調線付き)", "吹き出し: 線 (枠なし)", "吹き出し: 折線 (枠なし)", "吹き出し: 2 つ折線 (枠なし)", _

"吹き出し: 線 (枠付き、強調線付き)", "吹き出し: 折線 (枠付き、強調線付き)", "吹き出し: 2 つ折線 (枠付き、強調線付き)", "グループ化")

'Range("g1:g200") = WorksheetFunction.Transpose(ar11)

'Range("h1:h200") = WorksheetFunction.Transpose(ar12)

For i = 1 To 154

If dic_x.Exists(ar11(i)) = False Then

dic_x.Add ar11(i), ar12(i)

Else

End If

Next

 

End Sub

Sub 範囲取得()   セル間比率

Dim range1 As Range

Dim ar1() As Double

 Dim t1, total2 As Double

    Dim stcol, edcol, i, strow, edrow As Long

      Dim a1, b1 As String

Dim rui, n, j As Long

 

Dim MaxRow As Long

MaxRow = Cells(Rows.Count, "A").End(xlUp).Row

ReDim ar1(MaxRow, 3)

rui = 0

n = UBound(ar1, 1)

For i = 1 To n

ar1(i, 1) = Cells(i, "A")

rui = rui + ar1(i, 1)

'rui = 分割比率の合計

ar1(i, 2) = rui

Next

 

'    ' 結果をメッセージボックスに表示(例)

'    MsgBox "選択された範囲: " & selectedRange.Address

Dim selectedRange As Range

    Dim topLeftCell As Range

    Dim bottomRightCell As Range

    ' 現在選択されている範囲を取得

    Set selectedRange = Selection

    ' 範囲の左上のセルを取得

    Set topLeftCell = selectedRange.Cells(1, 1)

    ' 範囲の右下のセルを取得

    Set bottomRightCell = selectedRange.Cells(selectedRange.Rows.Count, selectedRange.Columns.Count)

    ' 結果をメッセージボックスに表示(例)

'    MsgBox "左上のセル: " & topLeftCell.Address & vbCrLf & "右下のセル: " & bottomRightCell.Address

    a1 = topLeftCell.Address

    b1 = bottomRightCell.Address

    '左上の行と列を取得

    Range(a1).Select

    strow = Selection.Row

    stcol = Selection.Column

'    右下の行と列を取得

    Range(b1).Select

     edrow = Selection.Row

    edcol = Selection.Column

    For i = strow To edrow

    Cells(1, i).Select

    t1 = t1 + Selection.ColumnWidth

    Next

    Dim keisu As Double

    keisu = t1 / rui      '1分割比率あたりの幅

    MsgBox t1 & "  ggg  " & rui & "   " & keisu

    For i = 1 To n

    ar1(i, 3) = ar1(i, 2) * keisu

'    MsgBox ar1(i, 3)

    Next

'    Exit Sub

    For j = 1 To n

    total2 = 0

    For i = stcol To edcol

     Cells(1, i).Select

     total2 = total2 + Selection.ColumnWidth

     If total2 > ar1(j, 3) Then

        MsgBox ar1(j, 3)

        MsgBox Selection.Column

        Exit For

      End If

    Next

    Next

    selectedRange.Select

End Sub

 


Sub 図形追加()

'Left,Top,Width,Height

ActiveSheet.Shapes.AddShape(msoShapeRectangle, 160.2, 99, 115.2, 69.6).Select

'   正方形 / 長方形

    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 114.6, 148.8, 52.8 _

        , 32.4).Select        'テキスト ボックス 21

    ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 125.4, 199.8, 66.6, 20.4) _

        .Select                  '四角形: 角を丸くする

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartOffpageConnector, 353.4, 207.6, _

        33.6, 34.2).Select    'フローチャート: 他ページ結合子

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartDocument, 455.4, 241.2, 53.4, 40.2 _

        ).Select               'フローチャート: 書類

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartMultidocument, 530.4, 216.6, 46.8 _

        , 49.8).Select      'ローチャート: 複数書類

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartSummingJunction, 421.8, 290.4, _

        30.6, 25.8).Select        'フローチャート: 和接合 28

End Sub

図形の定率拡大/縮小

Private Sub CommandButton1_Click()

Dim shp As Shape

Dim per As Long

Dim ratio As Double

per = Val(TextBox1)

ratio = 1 + per / 100

Application.ScreenUpdating = False                'ディスプレイ出力抑止

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

If OptionButton1 = True Then

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

 Selection.ShapeRange.ScaleHeight ratio, msoFalse, msoScaleFromTopLeft

Else

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

End If

Next

Application.ScreenUpdating = True                'ディスプレイ出力

End Sub

 

Private Sub CommandButton2_Click()

Dim shp As Shape

Dim per As Long

Dim ratio  As Double

per = Val(TextBox1)

ratio = 1 / (1 + per / 100)

Application.ScreenUpdating = False                'ディスプレイ出力抑止

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

If OptionButton1 = True Then

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

 Selection.ShapeRange.ScaleHeight ratio, msoFalse, msoScaleFromTopLeft

Else

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

End If

Next

Application.ScreenUpdating = True                'ディスプレイ出力

End Sub

 

Private Sub UserForm_Initialize()

OptionButton1 = True

End Sub


Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_STYLE = -16

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

Private Const WS_THICKFRAME = &H40000

 

別フォームを呼び出すときに、自身を極小化する

Private Sub CommandButton3_Click()

Dim hWnd As LongPtr

hWnd = FindWindowA(vbNullString, "UF1")

ShowWindow hWnd, 6

UserForm1.Show vbModeless

End Sub

 

呼び出したフォームを終了するとき、元のフォームを拡大する

Private Sub CommandButton7_Click()

Dim hWnd As LongPtr

hWnd = FindWindowA(vbNullString, "UF1")

ShowWindow hWnd, 9

Unload Me

End Sub

xボタンを押させない

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '×ボタンを押しても閉じない
    
    If CloseMode = 0 Then
        MsgBox "×ボタンで閉じないでください"
        Cancel = 1 '閉じる操作をキャンセル
    End If
End Sub

矢印の逆転

Sub CheckConnector矢印方向()

Dim shp As Shape

Dim A1, A2, A12 As String

    ' 選択されている図形のうち最初の図形を取得

For Each shp In Selection.ShapeRange

    ' 図形がコネクタであることを確認

    If shp.Name Like "*Connector*" Or shp.Name Like "*コネクタ*" Then

        ' コネクタの方向を判定

        If Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle Then

            A1 = "1"   '三角形

        ElseIf Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadStealth Then

            A1 = "2"      '矢印

        ElseIf Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadOpen Then

            A1 = "3"      '矢印線

        Else

            A1 = "4"      '開始印なし

        End If

        

        If Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle Then

            A2 = "1"

        ElseIf Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth Then

            A2 = "2"

        ElseIf Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen Then

            A2 = "3"

        Else

            A2 = "4"

        End If

    End If

    A12 = A1 & A2

    Select Case A12

        Case "41"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle

        Case "42"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadStealth

        Case "43"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadOpen

        Case "14"

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle

        Case "24"

        Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth

        Case "34"

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen

        Case Else

    End Select

    Exit Sub

Next

End Sub

 

 

 

多図形のサイズ変更時の重心移動

Option Base 1

Public ar1()

Public arx() As Double

Public ary() As Double

Public Lc As Long

Public ach As String

rivate Sub CommandButton1_Click()  '図形記憶

Dim shp As Shape

Dim ch As Long

Dim i As Long

Erase arx            '各図形のスペック配列

Erase ar1            '各図形の名前配列

Lc = 0                  '選択されている図形の数

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange    '選択されている図形の情報を順次取得

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(2, Lc) + (arx(4, Lc) / 2)    '左右の中心位置を求める

arx(6, Lc) = arx(1, Lc) + (arx(3, Lc) / 2)   '上下の中心位置を求める

Next

End Sub

 

Private Sub CommandButton2_Click()      '変更した図形の重心を元に戻す

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim H1() As Long

Dim L1() As Long

Dim ar2(1)

ReDim H1(Lc)

ReDim L1(Lc)

ReDim Preserve ary(6, Lc)

For i = 1 To Lc

ar2(1) = ar1(i)            '図形を選択するために 引数を配列にする必要がある

On Error Resume Next

Err.Clear

ActiveSheet.Shapes.Range(ar2).Select

If Err.Number <> 0 Then

MsgBox "図形が削除されています"

Err.Clear

Exit Sub

End If

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

ary(1, i) = shp.Top

ary(2, i) = shp.Left

ary(3, i) = shp.Height

ary(4, i) = shp.Width

ary(5, i) = ary(2, i) + (ary(4, i) / 2)

ary(6, i) = ary(1, i) + (ary(3, i) / 2)

Next

'シフト量算出

L1(i) = (arx(5, i) - ary(5, i))

H1(i) = (arx(6, i) - ary(6, i))

Selection.ShapeRange.IncrementLeft L1(i)      '左右の位置を補正

Selection.ShapeRange.IncrementTop H1(i)      '上下の位置を補正

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

Private Sub CommandButton3_Click()      'センタリング

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim av1 As Double

Dim ar2(1)

Dim L1() As Long

Erase arx

Erase ar1

Lc = 0

On Error Resume Next

For Each shp In Selection.ShapeRange

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(2, Lc) + (arx(4, Lc) / 2)      '図形の左右中心

Next

ReDim L1(Lc)

'センタリング

'図形の左右中心の平均値を求める

For i = 1 To Lc

av1 = av1 + arx(5, i)

Next

av1 = av1 / Lc

'各図形をセンタリングするために中心医師(av)との差を求める

For i = 1 To Lc

L1(i) = av1 - arx(5, i)

'ReDim ary(6, Lc)

ar2(1) = ar1(i)

ActiveSheet.Shapes.Range(ar2).Select

'

Selection.ShapeRange.IncrementLeft L1(i)

Next

ActiveSheet.Shapes.Range(ar1).Select

 

End Sub

Private Sub CommandButton4_Click()      '左寄せ

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim av1 As Double

Dim ar2(1)

Dim L1() As Long

Erase arx

Erase ar1

Lc = 0

On Error Resume Next

For Each shp In Selection.ShapeRange

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(1, Lc) + (arx(3, Lc) / 2)      '図形の左右中心

Next

ReDim L1(Lc)

'左寄せ

'図形の左端最低値を求める

av1 = arx(5, 1)

For i = 1 To Lc

If arx(5, i) < av1 Then

av1 = arx(5, i)

End If

Next

'各図形をセンタリングするために中心医師(av)との差を求める

For i = 1 To Lc

L1(i) = av1 - arx(2, i)

'ReDim ary(6, Lc)

ar2(1) = ar1(i)

ActiveSheet.Shapes.Range(ar2).Select

Selection.ShapeRange.IncrementLeft L1(i)

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

Private Sub CommandButton5_Click()

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim H1() As Long

Dim L1() As Long

Dim ar2(1)

ReDim H1(Lc)

ReDim L1(Lc)

For i = 1 To Lc

 

ReDim Preserve ary(6, Lc)

ar2(1) = ar1(i)

On Error Resume Next

 

ActiveSheet.Shapes.Range(ar2).Select

'If Error Then

'MsgBox "図形が削除されています"

'Exit Sub

'End If

 

'For Each shp In Selection.ShapeRange

ary(1, i) = arx(1, i)

ary(2, i) = arx(2, i)

ary(3, i) = arx(3, i)

ary(4, i) = arx(4, i)

'ary(5, i) = ary(2, i) + (ary(4, i) / 2)

'ary(6, i) = ary(1, i) + (ary(3, i) / 2)

'Next

'シフト量算出

'L1(i) = (arx(5, i) - ary(5, i))

'H1(i) = (arx(6, i) - ary(6, i))

MsgBox ary(1, 1)

Selection.ShapeRange.IncrementTop (ary(1, i) * -1)

 

Selection.ShapeRange.IncrementLeft (ary(2, i) * -1)

Selection.ShapeRange.Height ary(3, i)

Selection.ShapeRange.Width ary(4, i)

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

 

***************************************************************************************

ar1とlcはpublic宣言しておく  リストボックスを使ったセルの選択

Private Sub UserForm_Initialize()

Dim hwnd As LongPtr

hwnd = FindWindow("ThunderDFrame", Me.Caption)

SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) Or &H70000

End Sub

Private Sub cm1_Click()   '図形の個別選択を記憶、リストボックス表示

Dim shp As Shape

Dim ch As Long

Dim i As Long

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange

With UF1.ListBox1

.AddItem ""

.List(Lc, 0) = shp.Name

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ar1(Lc) = shp.Name

End With

Next

End Sub

Private Sub cm2_Click()      '記憶した図形を選択状態にする

If (Not ar1) = -1 Then

MsgBox "何も選択されていません"

Else

ActiveSheet.Shapes.Range(ar1).Select

End If

End Sub

Private Sub ListBox1_Click()    'リストボックスをクリックしたとき、その図形を選択

Dim ar2(1)

Dim i As Long

With UF1.ListBox1

i = UF1.ListBox1.ListIndex

ar2(1) = ar1(i + 1)

ActiveSheet.Shapes.Range(ar2).Select

End With

End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim ar2(1)

Dim i, k As Long

With UF1.ListBox1

k = UF1.ListBox1.ListIndex

For i = k + 2 To UBound(ar1)

ar1(i - 1) = ar1(i)

Next i

'■配列を再定義し、最終の要素を詰める

ReDim Preserve ar1(UBound(ar1) - 1)

Lc = Lc - 1

For i = ListBox1.ListCount - 1 To 0 Step -1

If ListBox1.Selected(k) Then

ListBox1.RemoveItem (k)

Exit For

End If

Next

End With

End Sub

Private Sub CommandButton1_Click()  'リストボックスのクリア

ListBox1.Clear

Lc = 0

Erase ar1

Range("A1").Select

End Sub

Private Sub CommandButton2_Click()  'リストの重複削除

Dim dic_1 As Object

Dim ar3()

Dim i, k As Long

If (Not ar1) = -1 Then

MsgBox "何も選択されていません"

Else

Set dic_1 = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(ar1)

If dic_1.Exists(ar1(i)) = False Then

dic_1.Add ar1(i), i

k = k + 1

ReDim Preserve ar3(k)

ar3(k) = ar1(i)

End If

Next

Erase ar1

ar1 = ar3

ListBox1.Clear

Lc = 0

For i = 1 To UBound(ar1)

With UF1.ListBox1

.AddItem ""

.List(i - 1, 0) = ar1(i)

Lc = Lc + 1

End With

Next

End If

End Sub

 

 

ユーザーフォームをアンダーバーで小さくする方法

フォームモジュールに追加します

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

 

Private Sub UserForm_Initialize()

Dim hwnd As LongPtr

hwnd = FindWindow("ThunderDFrame", Me.Caption)

SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) Or &H70000

End Sub

フォームをxで閉じようとしたとき

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        MsgBox "[閉じる]ボタンを使用してください"
        Cancel = True
    End If
End Sub

Sub 図形接続線描画()

'実行前に2つの図を選択しておく必要があります

Dim shp_n As String

Dim shp_ary(2)

Dim n1, n2, i As Long

Dim shp  As Shape

Dim shv(2)  As Shape

Dim sh_1 As String

Dim sh_2 As String

Dim top_ary(2) As Double

Dim base_flg As Long

Dim hx(2) As Integer

Dim hen, knd, y_mark As String

 

'外部変数入力 1 = 上下 2 = 左右

hen = InputBox("上か左右か")

knd = InputBox("カギか直線か曲線か")

y_mark = InputBox("三角、鋭角、線")

On Error Resume Next

hx(0) = 1    '配列インデックス0に代入してエラーが起きるかどうか確かめる

If Err.Number <> 0 Then  '  エラーが出たらoptionbase 指定がされている

    base_flg = 1

Else

    base_flg = 0

End If

With ActiveSheet

On Error GoTo err1

If Selection.ShapeRange.Count > 1 Then

    For Each shp In Selection.ShapeRange

        i = i + 1

        shp_ary(i) = shp.Name   '図形名を記憶する

       

        If Val(hen) = 1 Then

            top_ary(i) = shp.Top      '図形の位置関係を確認するため高さまたは左からの位置を取得する

        Else

            top_ary(i) = shp.Left

        End If

    Next

    If i > 2 Then

        MsgBox "図形が3つ以上選択されています"

        Exit Sub

    End If

Else      '図形が選択されていなかった場合

err1:

    Err.Clear

    MsgBox "図形が2つ選択されていません"

    Exit Sub

End If

End With

 

On Error Resume Next    '矢印の方向を決めるため上(左)の図形名称を決定する

If top_ary(1) < top_ary(2) Then

    sh_1 = shp_ary(1)

    sh_2 = shp_ary(2)

Else

    sh_1 = shp_ary(2)

    sh_2 = shp_ary(1)

End If

 

Select Case Val(knd)

    Case 1

        ActiveSheet.Shapes.AddConnector(msoConnectorElbow, 10, 10, 10, 10).Select

        '罫線で図形を連結する場合にはそのサイズは問わない

    Case 2

        ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 10, 10, 10, 10).Select

    Case Else

        ActiveSheet.Shapes.AddConnector(msoConnectorCurve, 10, 10, 10, 10).Select

End Select

shp_n = Selection.Name

Selection.Name = changeEngToJpn(shp_n)

'矢印の種類を決める

Select Case Val(y_mark)

    Case 1

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle

    Case 2

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth

    Case Else

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen

End Select

'罫線接続変数を決める 1=図形上中央 2=左中央 3=下中央 4=右中央

If Val(hen) = 1 Then    '上下接続か、左右接続か

   n1 = 3          '上(左)の図形の接続点

   n2 = 1           '下(右)の図形の接続点

Else

  n1 = 4

  n2 = 2

End If

'接続線の描画

Selection.ShapeRange.ConnectorFormat.BeginConnect ActiveSheet.Shapes(sh_1), n1

Selection.ShapeRange.ConnectorFormat.EndConnect ActiveSheet.Shapes(sh_2), n2

'最初選んでいた図形を選びなおす

ActiveSheet.Shapes.Range(Array(shp_ary(1), shp_ary(2))).Select

End Sub

図形の英文を和文に変更

Public Function changeEngToJpn(変換対象 As String) As String

Dim 図形名本体 As String, 図形名連番 As String

Dim 図形名英文配列 As Variant, 図形名和文配列 As Variant, st_buf() As String

Dim id As Integer

Dim hx(2) As Integer

Dim opflg As Long

On Error Resume Next

    hx(0) = 1    'エラーが起きる

' モジュールのコードを取得

 If Err.Number <> 0 Then

       opflg = 0

    Else

        ' Option Baseステートメントが見つからなかった場合(デフォルトはOption Base 0)

       opflg = -1

End If

Err.Clear

Const iMax As Integer = 39  '固定長の長さ

    図形名英文配列 = Array("Straight Connector                     001", "Straight Arrow Connector               002", "Elbow Connector                        003", "Curved Connector                       004", "Freeform                               005", "Rectangle                              006", "Rounded Rectangle                      007", "Snip Single Corner Rectangle           008", "Snip Same Side Corner Rectangle        009", "Snip Diagonal Corner Rectangle         010", _

        "Snip and Round Single Corner Rectangle 011", "Round Single Corner Rectangle          012", "Round Same Side Corner Rectangle       013", "Round Diagonal Corner Rectangle        014", "TextBox                                015", "Oval                                   016", "Isosceles Triangle                     017", "Right Triangle                         018", "Parallelogram                          019", "Trapezoid                              020", _

        "Diamond                                021", "Regular Pentagon                       022", "Hexagon                                023", "Heptagon                               024", "Octagon                                025", "Decagon                                026", "Dodecagon                              027", "Pie                                    028", "Chord                                  029", "Teardrop                               030", _

        "Frame                                  031", "Half Frame                             032", "L-Shape                                033", "Diagonal Stripe                        034", "Cross                                  035", "Plaque                                 036", "Can                                    037", "Cube                                   038", "Bevel                                  039", "Donut                                  040", _

        "No Symbol                              041", "Block Arc                              042", "Folded Corner                          043", "Smiley Face                            044", "Heart                                  045", "Lightning Bolt                         046", "Sun                                    047", "Moon                                   048", "Cloud                                  049", "Arc                                    050", _

        "Double Bracket                         051", "Double Brace                           052", "Left Bracket                           053", "Right Bracket                          054", "Left Brace                             055", "Right Brace                            056", "Right Arrow                            057", "Left Arrow                             058", "Up Arrow                               059", "Down Arrow                             060", _

        "Left-Right Arrow                       061", "Up-Down Arrow                          062", "Quad Arrow                             063", "Left-Right-Up Arrow                    064", "Bent Arrow                             065", "U-Turn Arrow                           066", "Left-Up Arrow                          067", "Bent-Up Arrow                          068", "Curved Right Arrow                     069", "Curved Left Arrow                      070", _

        "Curved Up Arrow                        071", "Curved Down Arrow                      072", "Striped Right Arrow                    073", "Notched Right Arrow                    074", "Pentagon                               075", "Chevron                                076", "Right Arrow Callout                    077", "Down Arrow Callout                     078", "Left Arrow Callout                     079", "Up Arrow Callout                       080", _

        "Left-Right Arrow Callout               081", "Quad Arrow Callout                     082", "Circular Arrow                         083", "Plus                                   084", "Minus                                  085", "Multiply                               086", "Division                               087", "Equal                                  088", "Not Equal                              089", "Flowchart: Process                     090", _

        "Flowchart: Alternate Process           091", "Flowchart: Decision                    092", "Flowchart: Data                        093", "Flowchart: Predefined Process          094", "Flowchart: Internal Storage            095", "Flowchart: Document                    096", "Flowchart: Multidocument               097", "Flowchart: Terminator                  098", "Flowchart: Preparation                 099", "Flowchart: Manual Input                100", _

        "Flowchart: Manual Operation            101", "Flowchart: Connector                   102", "Flowchart: Off-page Connector          103", "Flowchart: Card                        104", "Flowchart: Punched Tape                105", "Flowchart: Summing Junction            106", "Flowchart: Or                          107", "Flowchart: Collate                     108", "Flowchart: Sort                        109", "Flowchart: Extract                     110", _

        "Flowchart: Merge                       111", "Flowchart: Stored Data                 112", "Flowchart: Delay                       113", "Flowchart: Sequential Access Storage   114", "Flowchart: Magnetic Disk               115", "Flowchart: Direct Access Storage       116", "Flowchart: Display                     117", "Explosion 1                            118", "Explosion 2                            119", "4-Point Star                           120", _

        "5-Point Star                           121", "6-Point Star                           122", "7-Point Star                           123", "8-Point Star                           124", "10-Point Star                          125", "12-Point Star                          126", "16-Point Star                          127", "24-Point Star                          128", "32-Point Star                          129", "Up Ribbon                              130", _

        "Down Ribbon                            131", "Curved Up Ribbon                       132", "Curved Down Ribbon                     133", "Vertical Scroll                        134", "Horizontal Scroll                      135", "Wave                                   136", "Double Wave                            137", "Rectangular Callout                    138", "Rounded Rectangular Callout            139", "Oval Callout                           140", _

        "Cloud Callout                          141", "Line Callout 1                         142", "Line Callout 2                         143", "Line Callout 3                         144", "Line Callout 1 (Accent Bar)            145", "Line Callout 2 (Accent Bar)            146", "Line Callout 3 (Accent Bar)            147", "Line Callout 1 (No Border)             148", "Line Callout 2 (No Border)             149", "Line Callout 3 (No Border)             150", _

        "Line Callout 1 (Border and Accent Bar) 151", "Line Callout 2 (Border and Accent Bar) 152", "Line Callout 3 (Border and Accent Bar) 153", "Group                                  154")

    If InStrRev(変換対象, " ") = 0 Then    '連番が付番されていない場合

        図形名本体 = 変換対象

        図形名連番 = ""

    Else                                                      '連番が付番されてる場合 本体名と 連番に切り離す

        図形名本体 = Mid(変換対象, 1, InStrRev(変換対象, " ") - 1)  '図形名

        図形名連番 = Mid(変換対象, InStrRev(変換対象, " "))  '半角スペース+連番

    End If

    図形名本体 = 図形名本体 & Space(iMax - Len(図形名本体))  '固定長にする 設定最大文字数から本体文字数を引いて その差数の スペースを付加

    st_buf = Filter(図形名英文配列, 図形名本体)  'Filterは結果を配列で返す 図形名英文配列が無駄に長いのは、部分位置でフィルターにかからないため

    If UBound(st_buf) <> -1 Then                'option base 1 の時は 0

    id = Replace(st_buf(0), 図形名本体, "") + opflg  '添え字を取得   'option base 1 の時は 0

                                                                           '添え字を取得   'option base 1 の設定がされていない時 -1

    図形名和文配列 = Array("直線コネクタ", "直線矢印コネクタ", "コネクタ: カギ線", "コネクタ: 曲線", "フリーフォーム: 図形", "正方形/長方形", "四角形: 角を丸くする", "四角形: 1 つの角を切り取る", "四角形: 上の 2 つの角を切り取る", "四角形: 対角を切り取る", _

    "四角形: 1 つの角を切り取り 1 つの角を丸める", "四角形: 1 つの角を丸める", "四角形: 上の 2 つの角を丸める", "四角形: 対角を丸める", "テキスト ボックス", "楕円", "二等辺三角形", "直角三角形", "平行四辺形", "台形", _

            "ひし形", "五角形", "六角形", "七角形", "八角形", "十角形", "十二角形", "部分円", "弦", "涙形", _

            "フレーム", "フレーム (半分)", "L 字", "斜め縞", "十字形", "ブローチ", "円柱", "直方体", "四角形: 角度付き", "円: 塗りつぶしなし", _

            "禁止マーク", "アーチ", "四角形: メモ", "スマイル", "ハート", "稲妻", "太陽", "月", "雲", "円弧", _

            "大かっこ", "中かっこ", "左大かっこ", "右大かっこ", "左中かっこ", "右中かっこ", "矢印: 右", "矢印: 左", "矢印: 上", "矢印: 下", _

            "矢印: 左右", "矢印: 上下", "矢印: 四方向", "矢印: 三方向", "矢印: 折線", "矢印: U ターン", "矢印: 二方向", "矢印: 上向き折線", "矢印: 右カーブ", "矢印: 左カーブ", _

            "矢印: 上カーブ", "矢印: 下カーブ", "矢印: ストライプ", "矢印: V 字型", "矢印: 五方向", "矢印: 山形", "吹き出し: 右矢印", "吹き出し: 下矢印", "吹き出し: 左矢印", "吹き出し: 上矢印", _

            "吹き出し: 左右矢印", "吹き出し: 四方向矢印", "矢印: 環状", "加算記号", "減算記号", "乗算記号", "除算記号", "次の値と等しい", "等号否定", "フローチャート: 処理", _

            "フローチャート: 代替処理", "フローチャート: 判断", "フローチャート: データ", "フローチャート: 定義済み処理", "フローチャート: 内部記憶", "フローチャート: 書類", "フローチャート: 複数書類", "フローチャート: 端子", "フローチャート: 準備", "フローチャート: 手操作入力", _

            "フローチャート: 手作業", "フローチャート: 結合子", "フローチャート: 他ページ結合子", "フローチャート: カード", "フローチャート: せん孔テープ", "フローチャート: 和接合", "フローチャート: 論理和", "フローチャート: 照合", "フローチャート: 分類", "フローチャート: 抜出し", _

            "フローチャート: 組合せ", "フローチャート: 記憶データ", "フローチャート: 論理積ゲート", "フローチャート: 順次アクセス記憶", "フローチャート: 磁気ディスク", "フローチャート: 直接アクセス記憶", "フローチャート: 表示", "爆発: 8 pt", "爆発: 14 pt", "星: 4 pt", _

            "星: 5 pt", "星: 6 pt", "星: 7 pt", "星: 8 pt", "星: 10 pt", "星: 12 pt", "星: 16 pt", "星: 24 pt", "星: 32 pt", "リボン: 上に曲がる", _

            "リボン: 下に曲がる", "リボン: カーブして上方向に曲がる", "リボン: カーブして下方向に曲がる", "スクロール: 縦", "スクロール: 横", "波線", "小波", "吹き出し: 四角形", "吹き出し: 角を丸めた四角形", "吹き出し: 円形", _

            "思考の吹き出し: 雲形", "吹き出し: 線", "吹き出し: 折線", "吹き出し: 2 つ折線", "吹き出し: 線 (強調線付き)", "吹き出し: 折線 (強調線付き)", "吹き出し: 2 つ折線 (強調線付き)", "吹き出し: 線 (枠なし)", "吹き出し: 折線 (枠なし)", "吹き出し: 2 つ折線 (枠なし)", _

            "吹き出し: 線 (枠付き、強調線付き)", "吹き出し: 折線 (枠付き、強調線付き)", "吹き出し: 2 つ折線 (枠付き、強調線付き)", "グループ化")

        changeEngToJpn = 図形名和文配列(id) & 図形名連番

    Else

        changeEngToJpn = 変換対象

    End If

End Function

Public Sub font取得()

   Dim itm As Object

  Const CSIDL_FONTS = 20

  Dim arry1()

   Dim i As Long

   

   With CreateObject("Shell.Application").Namespace(CSIDL_FONTS)

    For Each itm In .Items

    i = i + 1

    ReDim Preserve arry1(i)

       arry1(i) = .GetDetailsOf(itm, 8)

    Next

  End With

  Range("M1").Resize(i, 1) = WorksheetFunction.Transpose(arry1)

End Sub

IF文の基本形

 

条件を満たさなかったときには何もしない

IF  CELLS(1,1) = 1 THEN 

 CELLS(1,2) = 2

ENDIF

 

または

IF  CELLS(1,1) = 1 THEN  CELLS(1,2) = 2

 

条件を満たさなかったときに別の処理をする

IF  CELLS(1,1) = 1 THEN 

 CELLS(1,2) = 2

ELSE

 CELLS(1,2) = 3

ENDIF

 

複数の条件で処理を変える(Ifnのネスト構造)

例:食べ放題の料金算出 A列性別 B列年齢 C列料金

IF  CELLS(1,"A") = "男"  THEN

  if  Cells(1,"B")  > 15 Then

          Cells(1,"C") = 2800

    else

          Cells(1,"C") = 1000

    End if

Else

    if  Cells(1,"B")  > 15 Then

          Cells(1,"C") = 2300

    else

          Cells(1,"C") = 800

    End if

End if

 

Ifには複合条件(or and)も設定できますが

余事象(else)の条件が読み取りにくくなったり

条件の設定漏れが発生することに注意しなければいけません。

 

またExcelSheetと違い、VBAのIFは処理の分岐にも使用します

例:If cells(i,1) = "" then Exit Sub

取得したセルの値がNullならば、処理を終了する

 

比較対象が文字の時は "" でくくる

例:IF  CELLS(1,1) = "A" THEN  CELLS(1,2) = 2

 

IF の代表的な比較演算子

=、>、<、>=、<=、<> (≠)

比較演算子だけではなく、結果がTrueがFalseの値を返してくれる関数はすべて使えます

代表例

If Cells(1,1) Like *AB*   Then ~   ABを含むならば

If Left(cells(1,1),2) = "AB" Then ~  ABではじまるならば

LeftはExcel関数をそのまま使えますが、使えない関数もあります

If WorksheetFunction.RoundUp(Cells(1, 1), 0) = 10 Then 

またVBAとExcelでは異なる関数もあります

Excel :=TEXT(A2,""yyyymmdd")

VBA   :Cells(2, 2) = Format(Cells(1, 1), "yyyymmdd")

 

比較文は 意味のない式は全て True になり 型が違うと全て Falseになる

If Cells(1, 1) = 100 Or 200 Then MsgBox "true" 

    (文法に沿っていないので全てTrue)

If Cells(1, 1) = 100 Then msgbox  "true" 

      (cells(1,1) が "100"ならば False

Excelシートで日付を見たら親の仇だと思え

   Excel シートの日付は VBAでは内部的に浮動小数点付き少数として扱われます。

     ⇒Format関数で文字列型に変換して使用しなければいけないケースが多々あります。

          日付型に使う関数と数字型に使う関数は全く別で VBAで日付を扱う時は

   日付用関数を使用しなければいけませんが、他の場所で使用するときは文字型に変換

      例 Cells(1, 2) = DateAdd("d", 3, Cells(1, 1))

        Excel では日付型に加算すると無条件に【日】が追加されますが

        VBAでは専用の関数が用意されています。

  

ExcelシートとVBAでは【型】の考えが全く違います

   Excelシート ⇒ 見え型

   ExcelVBA     ⇒ 型

 たおえば Cells(3,3) をシート上 文字列に設定します

   100 を 記入します ⇒ 100

   100 * 2 を記入します ⇒ 100*2 と表示されます

   ところが cells(3,4) に cells(3,3) * 2 と入れると 200 と表示されます

   ⇒ そのセルでは文字列型でも計算に使うと数字型として扱われます

   VBAで cells(3,4) = cells(3,3)  * 2 を実行するとエラーになります  ’型が一致しません'

 

まとめると

 If文を使いこなすには

  (1)If文そのものの文法を覚える

  (2)If文は必ず条件の評価(True or False)が伴うので

    比較演算子と関数を使えるようにします

  (3)比較演算子や関数は使用する項目の【型】に依存するので

    変数やセルの値の【型】を意識する必要があります

  (4)扱いたい変数やセルが期待した型でないときは、関数を使って

    (値を変えないまま)型を変更する技術が必要になります

 

Sub TEST1()

Dim ws As Worksheet

Dim i, MaxRow As Long

Dim MyDir, sh_name, NextexPath  As String

MyDir = ActiveWorkbook.Path

Sheets("Sheet1").Range("C:C").Copy Sheets("Sheet2").Range("A:A")

Sheets("Sheet2").Range("A:A").RemoveDuplicates Columns:=Array(1), Header:=xlYes

MaxRow = Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To MaxRow

sh_name = Sheets("Sheet2").Cells(i, 1).Value

On Error Resume Next

Application.DisplayAlerts = False

Sheets(sh_name).Delete

Application.DisplayAlerts = True

Error.Clear

Next

For i = 2 To MaxRow

   Sheets("Sheet1").Select

   sh_name = Sheets("Sheet2").Cells(i, 1).Value

   Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)

   Set ws = ActiveSheet

    ws.Name = sh_name

    If ActiveSheet.AutoFilterMode Then

    Else

    Rows("1:1").Select

    Selection.AutoFilter

    End If

  ws.Range("A1:E" & MaxRow).AutoFilter Field:=3, Criteria1:=sh_name

  NextexPath = MyDir & "\" & sh_name & ".pdf"

    ws.ExportAsFixedFormat _

        Type:=xlTypePDF, _

        Filename:=sh_name

 

ThisWorkbook.ExportAsFixedFormat _

        Type:=xlTypePDF, _

         filename:=exPath

 

  Next

End Sub


Private Sub UserForm_Initialize()   StartUpPosition =  00'手動

  Me.Left =  100

  Me.Top =   100
  'startupposition = 1 'Excelの中央   'startupposition = 2 '画面の中央   'startupposition = 3 '画面の左上 End Sub

For 文の基本

For文について述べる前に、VBAの特徴について

 

最初から極論ですが 、vbaには 一つの命令で一つのセルの値を

書き換えることしかできません。

そして、その一つのセルの位置を決めるために1つ以上の命令を使うことが

多々あります。

 

Excl関数がたくさん入っているシートは、どおかのセルの値が変更されると

(瞬時に)関係する他のセルの表示を変えることができます。

 

それに比べてVBAはマクロを実行しないとセルの値は変更されません。

またセルの中を覗いても(関数と違って)どうしてその値になっているかもわかりません。

 

一般には VBA > Excel関数  = VBAできるほうが関数使える人のほうがエライ

という先入観があるかもしれませんが

 

【計算】に関し絵は Excel関数 > VBA なのです

まあ関数でやると式が複雑すぎて解析できないというような例外もありますが。

 

VBAが関数より使いやすい点は

最終的に作りたい表の形式が一定でない場合(抽出や列の編集)、表と表の突合せや統合

小計だけを取り出す(ピポッドテーブル的な処理)

そして強力な編集機能です。(残業明細、給与基本データ、その他のデータから給与支給明細とか銀行別振込依頼書尾を作るなど)

一方メンバーとか要素が決まっている場合(生徒別科目別得点から各種順位や偏差値を計算する)などの場合関数のほうが有利となります。

 

ただ、どちらが優位かというのはVBAの基本機能(当然関数の基本機能も)わかっていないと判断できません。

 

その判断の基準となり大きな要素がIF文と、これから説明するFor文です

 

for文というのはいろいろな所で使われますが

最大(最頻といってもよいかも)昨日は

『1セルずつしか算出できないVBAの機能に対して』

【最初にどのセルに書き込むか】

【次回以降どセルに書き込むか】

【どのせるまで書き込んで処理を終了するか】

のコントロールにかかわるということです。

 

今までの例文では常に書き込む(セルに値を代入する)位置は固定でした。

cells(1,1)とか、これでは10行あるデータには10行の命令を作らなくてはいけません。

まして、何行あるか変動する場合、プログラミングのしようがありません。

 

そこで一般的な(あくまで一般的な)VBAプログラミングでは次のような手順をとります。

1.正規系のデータを作る(見出しとデータをセットで作る、key項目を決める、表と表の関係性

 が成立する場合、成立しない場合の条件、処理を決めておく)

 (これは最初あまり気にする必要はないです。ケースバイケースで場当たり的に決める場合も多いです)

2.元データと別のところに結果を編集する表を作成する

  (VBAは一度編集作業をすると、元の表はなくなってしまうから)

 この処理の中には、前回の算出結果をクリアーする も含まれます

3.対象範囲や算出範囲を決める。

4.その範囲を網羅するシナリオ(手順)を作成する

5.4.をもとに具体的なfor文を作成する。インデックスを決める。

6.for文を作成する

 

逆な言い方をすると、最終的に作りたい表をイメージして

1.その行は元データと同じか (抽出と編集 1行を2行にするというような場合も)

2.シートをコピーする

3.最終的に表示したい行を項目(列)は何か決めて抽出する

 (そのあとの手順と並行して実行する場合もあります)

 

3.見た目の表の始終業を、具体的な数字に置きなおすす

 開始行を決める

VBA(Visual Basic for Applications)の"For...Next"ステートメントは、指定された回数だけコードブロックを繰り返し実行するための機能です。以下に、VBAの"For...Next"ステートメントについて理解するための教材の例をご紹介します。

 

ループの基本構文:

VBAの"For...Next"ステートメントは、以下のような基本的な構文を持ちます。

 

vba

Copy code

For [カウンター変数] = [初期値] To [終了値] [Step [ステップ値]]

    ' 実行したいコード

Next [カウンター変数]

カウンター変数はループの回数をカウントするための変数であり、初期値から終了値までステップ値ごとに増加または減少します。ステップ値は省略可能で、指定しない場合はデフォルトで1となります。

 

単純なループの例:

 

vba

Copy code

Sub SimpleLoopExample()

    Dim i As Integer

    For i = 1 To 5

        MsgBox "現在の値は " & i & " です。"

    Next i

End Sub

この例では、変数iが1から5までの範囲で1ずつ増加し、各回でメッセージボックスが表示されます。

 

ステップ値を指定する例:

 

vba

Copy code

Sub StepValueExample()

    Dim i As Integer

    For i = 10 To 1 Step -2

        MsgBox "現在の値は " & i & " です。"

    Next i

End Sub

この例では、変数iが10から1まで2ずつ減少し、各回でメッセージボックスが表示されます。

 

これらの例を通じて、VBAの"For...Next"ステートメントの基本的な使い方を理解できると思います。さらに、実際のプロジェクトや課題に応じて応用的な使い方