Quantcast
Channel: いつも隣にITのお仕事
Viewing all 2099 articles
Browse latest View live

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法

$
0
0
scraper

photo credit: The Life of Bryan IMG_3780.jpg via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Windowsユーザーかつプログラミング初心者向けに、便利ツールを作りながらPythonを勉強していくという趣旨で記事を書いております。

さて、Pythonは本当にいろいろな方面で活躍するポテンシャルがあるプログラミング言語なのですが、書店など行くとよく「Webスクレイピング」というキーワードが目に入ると思います。

スクレイピングとはすなわち、Webサイトから情報を集めてくる技術のことです。

決まりきっているものであれば、わざわざ人の手で情報を集めてこなくても、プログラムに任せちゃえばラクチンできますもんね。

そして、Pythonはスクレイピングが得意というわけです。

ということで、今回からWebスクレイピングをテーマに便利ツールを作るという内容で連載をしていきたいと思います。

初回の今回は、Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法です。

では、行ってみましょう!

requestsモジュールをインストールする

まず、Webページを取得する際には、requestsというモジュールを使うと簡単にできます。

これは、標準のPythonに含まれていませんので、個別にインストールする必要があります。

ということで、コマンドプロンプトで以下pipコマンドを使ってインストールをします。

pip install requests

コマンドプロンプトでpip install requests

Successfully installed ~ requests-2.18.4 ~

まあ、他にもいろいろインストールされてしますが、requestsモジュールのインストールも無事に完了しているようです。

pipについて詳しい解説は以下の記事をご参考ください。

初心者向けPythonでパッケージ管理をしてくれるツールpipのはじめての使い方
非エンジニアでWindowsユーザー向けにPythonを学んでいく方法をお伝えしています。今回はPythonのパッケージ管理をするツールpipの初心者向けの最初の使い方についてお伝えします。

PythonでWebページを取得する

では、これで準備はバッチリですので、PythonでWebページを取得してみましょう。

requestsモジュールのインポート

まず、先ほどインストールしたrequestsモジュールを使いますので、スクリプトの冒頭でインポートをする必要があります。

import requests

これでOKです。

get関数でGETリクエスト

さて、Webページを取得するというのは、厳密に言うと

  1. 取得したいWebページが置いてあるサーバーに「Webページの情報をちょうだいな」とリクエストをする
  2. サーバーからのレスポンスを受け取る

という作業になります。

その際のリクエストの種類をHTTPメソッドと言いまして、「GET」とか「POST」とか、いくつかの種類があります。

基本的にWebページのデータが欲しいときはGETを使います。

PythonでGETリクエストをするのが、requests.get関数ということになります。

書き方はこうです。

requests.get(URL)

前置き説明が長かったですが、簡単ですね。

ResponseオブジェクトからWebページの情報を取り出す

requests.get関数の戻り値として、Responseオブジェクトというものが取得できます。

Responseオブジェクトは、以下のような属性を持っていて、つまりサーバーからのレスポンスを表すオブジェクトです。

  • text属性:WebページのHTMLデータ
  • status_code属性:レスポンスのステータスコード

WebページというのはHTMLというテキストデータで作られていまして、Responseオブジェクトのtext属性として格納されています。

これを取り出せばよいということになりますが、こう書きます。

Responseオブジェクト.text

Webページを取得するスクリプト

以上を踏まえて、スクリプトを用意しました。

import requests
res = requests.get('https://tonari-it.com')
print(res.text)

実行しますと以下のように超大量にHTMLテキストが出力されます。

PythonでWebページのHTMLをprint

一応、WebページのHTMLデータが取得できていることは確認できましたね。

htmlファイルとして保存してみる

ただ、ワーって表示しただけなので、これじゃ使いようがありませんね。

ということで、htmlファイルとして保存をしてみます。

htmlファイルと言っても、拡張子がhtmlなだけのテキストファイルですので、以下の記事に書いてあるような内容が使えます。

Pythonでテキストファイルに追加で書き込みをする基本中の基本
非エンジニアの初心者向けにPythonでクリップボードを操作する便利ツールの作り方をお伝えしています。今回はPythonでテキストファイルに追加で書き込みをする基本中の基本の方法をお伝えします。

これを元に作ったのが、こちらのスクリプト。

import requests
res = requests.get('https://tonari-it.com';)
#print(res.text)
with open('tonari-it.html', 'w') as file:
    file.write(res.text)

実行すると、「tonari-it.html」というファイルがPythonのファイルと同じフォルダに保存されます。中身を確認してみましょう。

Pythonで取得したhtmlファイル

大丈夫そうです。

まとめ

以上、PythonでWebスクレイピングをする第一歩、Webページをまるごと取得する方法についてお伝えしました。

  • requestsモジュールのインストールとインポート
  • get関数の使い方
  • Responseオブジェクトとtext属性の取得

結果、たったの3行のスクリプトで取得できちゃうという…簡単ですね。

この後、いろいろと欲しい情報だけを抽出したりとかする必要がありますので、追って解説をしていきます。

なお、requestsモジュールのpost関数の使用例として、以下記事もありますので、合わせてご覧ください。

Pythonでチャットワークにメッセージを送る方法
PythonからチャットワークのAPIを利用して、チャットワークにメッセージを送る方法を解説します。PythonのRequestsというモジュールを使用します。

では、次回をお楽しみに!


PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

プログラミング初心者&Windowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。

前回の記事はコチラ。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

最初の一歩ということで、特定のWebページのHTMLを丸ごと取得する方法についてお伝えしました。

では、さっそくHTMLの解析だ!欲しいデータの抽出だ!!

と行きたいところなのですが、ちょっと待ってください。

ほら、スクレイピングって、サーバー調子悪かったり、URL間違えてたりすると取得できないんです。

そんなときどうなっちゃうんですかね?

ということで、PythonでHTTPリクエストする際のエラーのチェックと安全な中止の仕方についてお伝えします。

前回のおさらいと今回のお題

前回作成したスクリプトはコチラ。

import requests
res = requests.get('https://tonari-it.com';)
print(res.text)

requestsモジュールを使って、指定したURLにGETリクエストをして、そのWebページのHTMLを取得して表示、というスクリプトでした。

簡単ですね。

通信ができないときに実行してみる

ただ…Webスクレイピングはスクリプトが正しければちゃんと動くというわけではありません。

  • 接続先のサーバーが調子悪い
  • そもそもURLが間違えている

などの理由から、うまく取得ができないときがあります。

そんな時はどうなっちゃうでしょうか。

実際に、存在しないURL「https://tonari-it.com/not_exists」宛に実行してみましょうか。

pythonで取得した404ページのHTML

…おや、取得できちゃいました。

ですが、ちょっと眺めると

お探しのページは見つかりませんでした |  Not_Exists

などとあります。実際に、ブラウザでこのURLを見てみると、いわゆる404ページでした。

いつも隣に404ページ

ということで、なんか動くけど、正しい結果が得られていなかったというややこしい感じになっちゃいますね。

レスポンスのエラーをチェックして安全に中止する

それで、基本方針としては、どうせスクリプトが正しく動かないなら、より安全に中止させよう!というアイデアで進めていきます。というか、それが推奨されています。

というのも、きっとどこかで変な挙動になるのですが、それを起こすより前に、うまくいかなかったのを検知してそこで止めちゃったほうが、安全だし、対応すべきパターンが絞られるので対処もしやすいということになります。

HTTPステータスコードとは

まず、GETリスクエストに対して正しいレスポンスが得られたかどうか、というのはHTTPステータスコードなるもので確認をすることができます。

HTTPステータスコードというのは、通信をしている際の状態を表す3桁の数字で、大まかに以下のように分類されます。

  • 100番台:処理中
  • 200番台:成功
  • 300番台:リダイレクト
  • 400番台:クライアントエラー
  • 500番台:サーバーエラー

requestsモジュールでget関数を使ったときにHTTPステータスコードを知るには、Responseオブジェクトのstatus_code属性を調べるという方法があります。

Responseオブジェクト.status_code

これで取得できます。

実際に、先ほどの存在しないページを使って、以下のようなスクリプトを実行してみると

import requests
res = requests.get('https://tonari-it.com/not_exists/')
print(res.status_code)

こんな出力が得られます。

PythonでResponseオブジェクトのstatus_codeを取得

404。そのまんまですね。

raise_for_statusメソッドで例外を発生

このステータスコードが200番台以外であれば、止めちゃえ!ということになります。

Responseオブジェクトのstatus_code属性をif文などで判定して…という手もありますが、もっと簡単な方法が用意されています。

それが、Responseオブジェクトのraise_for_statusメソッドです。

Responseオブジェクト.raise_for_status()

Responseオブジェクトが持つステータスコードが200番台以外だったら、例外を起こす、つまりエラーメッセージを吐き出してスクリプトを停止します。

実際にやってみましょう。こちらのスクリプトです。

import requests
res = requests.get('https://tonari-it.com/not_exists/')
res.raise_for_status()
print(res.text)

実行結果はコチラ。

PythonでResponseオブジェクトのraise_for_statusメソッドで例外が発生

requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://tonari-it.com/not_exists/

エラーが出て止まっちゃいますが、これでOK。

しかも、エラーメッセージがとっても親切。

まとめ

以上、PythonでWebページを取得できたかチェックする方法、またエラーの際に安全にスクリプトを中止する方法についてお伝えしました。

  • HTTPステータスコードとResponseオブジェクトのstatus_code属性について
  • Responseオブジェクトのraise_for_statusメソッドで例外を発生させる

本当は例外の発生をtry/except文でキャッチして分岐して…としたいところですが、それはまた別の機会にお伝えできればと思います。

次回は、いよいよHTMLの解析を進めていきます。

どうぞお楽しみに!

Pythonで取得したWebページのHTMLを解析するはじめの一歩

$
0
0
perse

photo credit: K!T Screwed via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。

前回の記事はコチラ。

PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
プログラミング初心者&Windowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。PythonでHTTPリクエストする際のエラーのチェックと安全な中止の仕方についてです。

Webページを取得した際にエラーかどうかをチェックする方法についてお伝えしました。

これにて安全にWebページのHTMLを取得できるようになりましたので、いよいよ「解析」をして、欲しい情報だけを抽出していくという段取りに入ります。

ということで、今回はPythonでWebページのHTMLを解析するはじめの一歩についてお伝えします。

Beautiful Soupという変な名前のモジュールを使います。

では、行ってみましょう!

前回のおさらい

では、まずは前回のおさらいから。

作成したスクリプトはコチラでした。

import requests
res = requests.get('https://tonari-it.com')
res.raise_for_status()
print(res.text)

  • requestsモジュールのget関数で取得したいWebページのResponseオブジェクトを取得
  • Responseオブジェクトが正常でなければ例外をスロー
  • ResponseオブジェクトからHTML文字列を取り出して表示

という流れです。

今回は、取り出したHTML文字列を解析して、titleタグの情報を取得・表示していきたいと思います。

Beautiful Soupモジュールをインストールする

PythonでHTML解析をするにはBeautiful Soupという変な名前のモジュールが便利です。

HTML文字列から、タグを条件にしたり、id属性を条件にしたりなど、いろいろな方法で要素を取り出すことができます。

では、そのBeautiful Soupという変な名前のモジュールをpipでインストールしましょう。

コマンドプロンプトを開いて、以下コマンド実行です。

pip install beautifulsoup4

すぐにインストールが完了します。

pipでBeautiful Soupモジュールをインストール

Successfully installed beautifulsoup4-4.6.0

これで準備は完了です。

pipについては以下記事もご覧ください。

初心者向けPythonでパッケージ管理をしてくれるツールpipのはじめての使い方
非エンジニアでWindowsユーザー向けにPythonを学んでいく方法をお伝えしています。今回はPythonのパッケージ管理をするツールpipの初心者向けの最初の使い方についてお伝えします。

PythonでHTML文字列を解析する

では、Beautiful SoupモジュールでHTMLを解析していきましょう。

Beautiful Soupモジュールをインポートする

まず、スクリプトの冒頭でBeautiful Soupモジュールのインポートが必要です。

インストール時には「beautifulsoup4」という名称でしたがが、インポートするときは「bs4」という名称を使いまして

import bs4

とします。

BeautifulSoupオブジェクトを生成する

Beautiful Soupモジュールを使ってHTMLを解析するためには、まずHTML文字列からBeautifulSoupオブジェクトを生成します。

書式は以下の通りです。

bs4.BeautifulSoup(HTML文字列, パーサー)

パーサーというのはパースをするやつ、つまり解析をするための機能のことで、ここで好みのパーサーを指定できます。

html5libやlxmlなど、いくつか種類がありますが、使用する場合は別のモジュールのインポートが必要になります。ひとまず、困ることが出てくるまでは、Pythonに標準で付属している「html.parser」を指定しておきます。

さて、こうしてHTML文字列からBeautifulSoupオブジェクトの状態になったら、解析がじゃんじゃんできるよということですね。

title要素を取得する

続いて、BeautifulSoupオブジェクトからtitle要素を取得してみたいと思います。

title要素は、名前の通り、そのページのタイトルをつかさどる要素です。SEOで言うととっても重要です。

BeautifulSoupオブジェクトから特定の要素を取得するには、以下のようにします。

BeautifulSoupオブジェクト.タグ名

title要素を取得したければ、タグ名を「title」とすれば良いということですね。

なんとシンプル!

では、これまでの一連の命令を使用して、以下スクリプトを作成しましたので実行してみましょう。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
print(soup.title)

実行結果はコチラ。

PythonでWebページのタイトル要素を取得

いつも隣にITのお仕事 | 毎日の業務が楽チンに!

バッチリです。

タグで最初の要素を取得する

ですが、一点注意です。

例えば、調子に乗って、h2タグを取得しようとします。

h2タグはいわゆる2番目に大きい「見出し」を表す要素です。で、この要素はページ内にたくさん存在する可能性があり、実際今回のページでも21個あるはずですが、以下スクリプトを実行しても

import requests, bs4
res = requests.get('https://tonari-it.com';)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
print(soup.h2)

得られるのは以下のh2要素だけです。

つまり、「BeautifulSoupオブジェクト.タグ名」で取得できるのは、最初に登場した該当のタグだけです。

ページ内の複数のタグを取得するには別の方法を使う必要があります。

これについては次回の記事でお伝えしていきます。

まとめ

Pythonで取得したWebページのHTMLを解析する初めの一歩についてお伝えしました。

  • Beautiful Soupモジュールとそのインストール・インポート
  • BeautifulSoupオブジェクトの生成
  • BeautifulSoupオブジェクトから特定のタグの最初の要素を取得

などです。今回はtitle要素を取得しただけですが、おそらくこれから色々な解析をしていくことでしょう。

次回は、予告通り、ページ内で複数のタグ要素を取得する方法についてお伝えします。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩

PythonでWebページ内の特定のタグ要素をまとめて取得する

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者向け&Windowsユーザー向けのPythonでWebページのスクレイピングをする方法をお伝えしております。

前回の記事はコチラです。

Pythonで取得したWebページのHTMLを解析するはじめの一歩
初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。今回はPythonでWebページのHTMLを解析するはじめの一歩、Beautiful Soupモジュールの使い方です。

Beautiful Soupモジュールを使って取得したWebページを解析する準備完了というところまでお伝えしています。

さて、いよいよ本格的にHTMLの解析をしていく必要があります。

解析…といってもどう進めていいものやら…というところもあるかも知れませんので、Chromeブラウザのデベロッパーツールを使いながら、その方法をお伝えしてきましょう。

まずは、PythonでWebページの特定のタグをまとめて取得する方法です。

では、行ってみましょう!

前回のおさらい

まずは、前回のおさらいから。

作ったスクリプトはコチラでした。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
print(soup.title)

  1. 当ブログのトップページについてrequestsモジュールのget関数で取得してきて
  2. そのレスポンスが正常かどうかチェック(正常でない場合は例外をスロー)
  3. そのHTML文字列からBeautifulSoupオブジェクトを生成
  4. titleタグの最初の要素を抽出して表示

と、こんなスクリプトです。

簡単なHTML解析として

BeautifulSoupオブジェクト.タグ名

とすることで、特定のタグ要素を取得できるのですが、取得できるのは最初に登場した一つの要素だけです。

title要素など、おそらくWebページごとに1つであろうタグの要素なら良いのですが、一般的には同じタグが複数存在しているので、その場合は使えません。

今回は、その点を解消していきます。

Chromeのデベロッパーツールについて

と、その前に、本来Webスクレイピングをする際には、欲しい情報がどんなタグに含まれているのかとか、どんな属性を持っているのかとか、つまりどんな条件で要素を取り出せば良いのかを知る必要があります。

その手段として、Google Chromeのデベロッパーツールを使わない手はありません。

欲しい情報を構成するHTML要素を確認する

解析したいWebページを開いて、ショートカットキー Ctrl + Shift + I または F12 キーを押下すると、デベロッパツールが起動します。

下図の「Select an element in the page to inspect it」のアイコンをクリックするか、ショートカットキー Ctrl + Shift + C でWebページ上に青い枠が出てくるようになります。

この状態で欲しい情報があるエリアをクリックすると、右側にのHTMLコードがワーって書いてあるところも連動して、そのエリアを示す箇所にフォーカスが当たります。

Chromeのデベロッパーツールで要素のHTMLを調べる

この機能を使えば、欲しいWebページの情報が、どんなHTMLで構成されているのかということがわかるのです。

欲しいHTML要素のouterHTMLをコピーする

それで、当ブログのトップページで言うと、記事一覧になっているのですが、その記事タイトルがh2タグで構成されているということです。

例えば、一つ例として記事タイトルのHTMLを取り出してみましょう。

この場合も、デベロッパーツールが便利です。

右側の欲しいHTML要素を選択した状態で、右クリック。表示されたメニューから「Copy」→「Copy outerHTML」とたどります。

ChromeのデベロッパーツールでouterHTMLを取得

これで、outerHTMLつまり「タグも含めた外側のHTML文字列」がクリップボードにコピーされましたので、ペーストしてみましょう。

Pythonで取得したWebページのHTMLを解析するはじめの一歩

特定のタグの要素を取得する

ということで、今回のお題「ブログのトップページの記事一覧から記事タイトルを含むタグを取得したい」ということで進めていきますね。

BeautifulSoupオブジェクトのselectメソッド

Pythonでその目的を達成するためには、BeautifulSoupオブジェクトのselectメソッドを使う方法があります。

書き方はこちらです。

BeautifulSoupオブジェクト.select(セレクタ)

セレクタで指定した条件にマッチした要素を全て取得し、Tagオブジェクトのリストとして取得するのです。

Tagオブジェクトというのは、Beautiful Soupモジュールにおける、HTML要素を表現するオブジェクトです。

なお、セレクタというのは、CSSセレクタでのことで、いろいろな条件指定をすることができます。

例えば、h2タグを取得したければ

BeautifulSoupオブジェクト.select(‘h2’)

とします。他の使い方に関しては追ってお伝えしていきます。

ページ内の特定の要素を全て表示するスクリプト

では、これを使用して、ブログのトップページからh2要素を全て表示してみましょう。

スクリプトはコチラです。

import requests, bs4
res = requests.get('https://tonari-it.com';)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('h2')
for elem in elems:
    print(elem)

selectメソッドでは、Tagオブジェクトのリストが取得できますので、リストに対してfor文を回して全ての要素について表示をしています。

出力結果はコチラ。

Pythonで取得したh2タグのTagオブジェクト

ぶわーっと出てきちゃいましたが、うまくいっているようです。

まとめ

PythonでWebページ内の特定のタグ要素をまとめて取得する方法についてお伝えしました。

けっこう、半分以上Chromeのデベロッパーツールの話になってしまいましたが、スクレイピングをする上で有用ですので、ぜひ覚えておいていただければと思います。

次回は、より色々な情報を取得できるようにしていきたいと思います。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩
  4. PythonでWebページ内の特定のタグ要素をまとめて取得する

PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法

$
0
0
class

photo credit: woodleywonderworks middle school math class via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法をお伝えしております。

前回の記事はコチラです。

PythonでWebページ内の特定のタグ要素をまとめて取得する
初心者向け&Windowsユーザー向けのPythonでWebページのスクレイピングをする方法をお伝えしております。今回は、PythonでWebページの特定のタグをまとめて取得する方法です。

Webページ内の特定のタグをまとめて取得する方法をお伝えしました。

今回は、別の要素の抽出の方法として、class属性による方法をお伝えします。

では、PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法です。

では、行ってみましょう。

前回のおさらいとお題

まずは、前回のおさらいから。

作成したスクリプトはこちらです。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('h2')
for elem in elems:
    print(elem)

当ブログのトップページについて、reauestsモジュールを使ってHTMLをGETして、Beautiful Soupモジュールを使って、その中から「記事タイトル」を取得するために、h2タグの要素をリストで取得して表示するというものです。

それで、実行すると以下のようにShellウィンドウに表示がされます。

PythonでHTMLのh2要素を表示

一応、h2タグを取得するという目的は達成しているのですが、一番最初に記事タイトルっぽくない要素がありますね。

Chromeでデベロッパーツールで調べてみると、以下の通り、サイトタイトルの直後にh2タグが使われています。

記事タイトルではないh2要素

今回は、この記事タイトルではないh2要素を除外して、記事タイトルを表すh2要素を取得する方法を模索していきます。

特定のclass属性を持つ要素を取得する

作戦を練るためにデベロッパーツールを眺めます。

すると、記事タイトルを表す要素は

  • h2タグの中にaタグが含まれている
  • aタグに「class=”entry-title entry-title-link”」という文字列が含まれている

という法則があるということに気が付きます。

特定のクラスを持つ要素

aタグのouterHTMLを抜き出すと以下の通りです。

PythonでWebページ内の特定のタグ要素をまとめて取得する

class属性とは

この「class=」から始まるパラメータは、class属性といいます。

定義としては以下引用をご覧ください。

class属性は、その要素にクラス名を指定します。クラス名を指定する主な目的はスタイリングの際の目印であるCSSのセレクタとして使われます。id属性と異なり、ひとつの文書内に同じクラス名を何度でも用いることができます(重複可)。また、半角スペースで区切って列記することで、ひとつの class属性の値に複数のクラス名をつけて複数のスタイルを適用することもできます。

引用:class属性|(X)HTML辞典 – W3G

class属性を条件に要素を取得する

BeautifulSoupオブジェクトのselectメソッドは、以下のようにセレクタを引数として渡します。

BeautifulSoupオブジェクト.select(セレクタ)

特定のクラスを持つ要素を取得するセレクタ

.クラス

というように、ピリオドに続けてクラスを記述します。

それで、今回は「class=”entry-title entry-title-link”」とあるように、「entry-title」と「entry-title-link」という二つのクラスをclass属性として持っています。

従って、二つのクラスを持つ要素を取得したいのですね。

二つのクラスを持つ要素を取得する場合のセレクタ

.クラス1.クラス2

と連結して記述します。

これで、複数のクラスを持つということを条件とすることができます。

特定のクラスを持つ要素を抽出するスクリプト

これを踏まえて、以下のようにスクリプトを変更しました。

import requests, bs4
res = requests.get('https://tonari-it.com';)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('.entry-title.entry-title-link')
for elem in elems:
    print(elem)

実行をすると、以下のように指定したクラス「entry-title」「entry-title-lin」の両方を持つ要素のみ抽出することができました。

Pythonで指定したクラスを持つ要素のみ表示

まとめ

PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法についてお伝えしました。

  • class属性とは何か
  • 特定のクラスを持つ要素についてのセレクタの書式

さて、次回も別の条件で要素を取得する方法についてお伝えします。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩
  4. PythonでWebページ内の特定のタグ要素をまとめて取得する
  5. PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法

PythonでWebページからid属性を条件にして要素を取得する方法

$
0
0
id

photo credit: PeterThoeny Bumper to bumper via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者向け&Windowsユーザー向けにPythonでWebスクレイピングをする方法をお伝えしています。

前回はコチラの記事でした。

PythonでWebページから特定のclass属性を持つ要素をまとめて取得する方法
初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法お伝えしております。今回は、PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法です。

WebページのHTMLからclass属性によって要素を取得する方法でした。

ですが、HTML解析をする上で、class属性だけではちょっと物足りない。

ということで、今回は別の方法をお伝えしていきますよ。id属性を使います。

では、PythonでWebページからid属性を条件にして要素を取得する方法、行ってみましょう。

前回のおさらい

では、前回のおさらいから行きます。

作成したスクリプトはコチラでした。

import requests, bs4
res = requests.get('https://tonari-it.com';;)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('.entry-title.entry-title-link')
for elem in elems:
    print(elem)

当サイトのトップページの記事タイトル一覧から、記事タイトルを含む要素を取得するスクリプトです。

requestsモジュールを使ってHTMLをgetしてきて、Beautiful Soupモジュールで解析して、class属性として「entry-title entry-title-link」を持つ要素を取得しています。

このページにおいてはこの方法で確かに目的の要素が取得できていますので、問題ないといえば問題ないのですが、class属性だけではうまく取得できないときも実際にあり得ます。

ですので、確実に目的の要素を取得できるように、別の方法も見ていきましょう。

特定のid属性を持つ要素を取得する

そこで注目するのは、以下図にある

「id」という属性が付与されている部分です。

Chromeデベロッパーツールでid属性を確認

取得したい要素よりもだいぶ上の階層だな~なんて思われるかも知れませんが、実はけっこう有効です。

id属性とは

というのも、この「id=」から始まるパラメータは、id属性といいまして、HTML解析において超強力な道しるべになります。また、id属性の値をID名といいます。

id属性の定義を調べてみますと

id属性(identifier)は要素を識別するために固有の ID名(識別子)をつけます。ひとつの文書内で同一の ID名を複数つけること(重複)はできません(つまり、一意でなければならない)。id属性を指定する主な目的はスタイルシート(CSS)のセレクタ(スタイルを適用する対象の目印のこと)にしてスタイリングや、スクリプト(JavaScript)で特定要素を参照してスクリプティングを行うための手段として使われます。

引用id属性|(X)HTML辞典

とあります。重要なのは、「ひとつの文書内で同一の ID名を複数つけること(重複)はできません」というところです。

つまり、同じWebページに、とあるid属性を持つ要素は一つしかないのです。

class属性は複数の要素が持つ可能性がありました。複数を取得したいときは便利なのですが、その中からさらに絞り込む必要があるときは面倒です。

ですが、欲しい要素がid属性さえ持っていれば、最短距離でその要素を取得できるのです。

id属性を条件に要素を取得する

id属性を条件に要素を取得するセレクタは以下の通りです。

#ID名

シンプルですね。

ですから、前述の「id=”list”」の要素を取得するには、selectメソッドを

elems = soup.select('#list')

とすればよいということになります。

記事タイトルの要素を取得する

ですが、今回ほしいのは、ID名「list」を持つdiv要素の中に含まれる、h2タグの要素だったりします。

その場合は、「~要素の中の~要素」というように、特定の要素の下の階層のみを対象にして要素を取得するような指定をします。

セレクタとしては、以下のようにセレクタとセレクタを半角スペースでつなげるだけです。

セレクタ1 セレクタ2

これでセレクタ1が示す要素の下の階層のうち、セレクタセレクタ2が示す要素、という意味になります。

ですから「id=”list”」を持つ要素の配下のh2タグを持つ要素であれば

elems = soup.select('#list h2')

となるわけです。

記事タイトルの要素を取得するスクリプト

それで、実際のスクリプトはこちらになります。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('#list h2')
for elem in elems:
    print(elem)

このスクリプトを実行すると、以下のように対象となる要素が出力されます。

Pythonでid属性で記事タイトル要素を取得

まとめ

PythonでWebページからid属性を条件にして要素を取得する方法についてお伝えしました。

  • id属性とは何か
  • 特定のID名を持つ要素についてのセレクタの書式
  • 特定の要素の配下を対象に要素を取得する場合のセレクタの書式

これで、タグ、class属性、id属性を条件に要素を取得することができました。他にもいくつか方法がありますが、基本としてはこれくらいでまあまあのHTML解析はいけると思います。

では、続いて取得した要素から、テキストやURLなどを取り出す方法をお伝えします。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩
  4. PythonでWebページ内の特定のタグ要素をまとめて取得する
  5. PythonでWebページから特定のクラスを持つ要素をまとめて取得する方法

【エクセルVBA】表の最終行・最終列を取得する方法のまとめ

$
0
0

old-1130743_1280
みなさん、こんにちは。
なかじ(@nakaji098)です。

これまで表の範囲を取得する方法をいくつかご紹介してきました。

今回は、表の最終行・最終列を取得する方法を紹介していきます。

表の最終行・最終列を取得する方法は、表の範囲を取得する方法と同じように複数あります。
それぞれの方法に特徴があり、表によって使い分ける必要があります。

ここでは3つの方法を紹介します。

  • Endプロパティ
  • CurrentRegionプロパティ
  • UsedRangeプロパティ

Endプロパティを使って取得する方法

このEndプロパティを使う方法が、最終行・列を取得する方法としては、最も使われていると思います。

Rangeオブジェクト.End(Direction)
引数 方向
xlDown
xlUp
xlToLeft
xlToRight

Endプロパティを使って表の最終行を取得する方法は、以前の記事でもご紹介しましたので、参考にしてください。

【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法
今回は、Endプロパティを使って表の最終行番号を取得する方法をご紹介したいと思います。 今回ご紹介するEndプロパティを使用することで、簡単に表の最終行を取得することができます。

表の最終行を取得

まずは、表の最終行を取得する方法です。

この表を使って説明していきます。
vba_table

Sub Endプロパティの実行例()
Msgbox Worksheets(1).cells(rows.count,2).end(xlup).Row
End Sub

vba_table2

これで、表の最終行番号できました。

Rows.Countはシートの行数を取得します。
シートの行数はExcel2007以降は1048576行、Excel2003は65536行です。

シートの最終行から、上方向に進んでいき、最初にデータが入力されているセルの行を指定します。
なので、空白行がある表でも、データが入力されている最終行番号を取得することができます。

1列目が空白の場合は、上のコードのように2列目のセルを指定する必要があります。

表の最終列を取得

次は、表の最終列を取得する方法です。

Sub Endプロパティの実行例()
MsgBox Worksheets(1).Cells(2, Columns.Count).End(xlToLeft).Column
End Sub

vba_table3

このコードはシートの1行目が空白行の場合です。
1行目が空白の場合は、上のコードのように2行目を指定する必要があります。

2行目の最終列から左方向に移動し、最初にデータが入力されているセルの列を指定しています。

そのため、ここで9行目を指定しまうと正しい最終列が指定されません。

Sub Endプロパティの実行例()
MsgBox Worksheets(1).Cells(9, Columns.Count).End(xlToLeft).Column
End Sub

vba_table4

Endプロパティを使う場合には、どのセルを基準とするかが大事になります。

CurrentRegionプロパティを使って取得する方法

次は、CurrentRegionプロパティを使って表の最終行・最終列を取得する方法についてです。

Rangeオブジェクト.CurrentRegion

このプロパティを使用することで、指定したRangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)を取得することができます。

Endでプロパティでは、基準に選んだセルの列が、最終列になります。
なので、上の例のように最終列にデータのないセルを基準にしてしまうと、うまく取得することができません。

このような場合には、CurrentRegionプロパティを使うことで簡単に取得することができます

表の最終行を取得

まずは、最終行の取得からです。
この方法は、後で説明するUsedRangeプロパティと混同してしまうので気を付けてください。

この表を使います。
vba_table5

それでは実際のコードです。

Sub CurrentRegionプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.Range("B2").CurrentRegion(ws.Range("B2").CurrentRegion.Count).Row

End Sub

vba_table6
最終行が取得できました。

コードについて、少し説明します。
使う人は少ないと思いますが、CurrentRegionプロパティには引数を指定することができます

CurrentRegion(引数)

この引数には整数が指定され、その整数に対応したCurrentRegion内のセルを指定することができます。
セルの番号は、表の左上から右に1,2,3…となっております。
vba_table8

具体例をあげてみます。

Sub CurrentRegionプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

ws.Range("B2").CurrentRegion(1).select

End Sub

vba_table7

引数に1を指定したので、表の一番左上のB2セルが選択されました。

このように引数に整数を指定することで、CurrentRegion内のセルを取得することができます。
そして、この引数にCurrentRegion.Countで取得した総セル数(上の例では28)が指定されることで、表の最終セルが取得されます。
その最終セルの行が、表の最終行になるのです。

表の最終列を取得

表の最終行が取得できれば、最終列を取得することは簡単です。
表の最終セルの行が最終行なので、最終セルの列が最終列になります。

Sub CurrentRegionプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.Range("B2").CurrentRegion(ws.Range("B2").CurrentRegion.Count).Column

End Sub

vba_table9

最終列である5行目が取得されました。

空白行がある場合

簡単に表の最終行・列が取得できるCurrentRegionプロパティですが、空白行がある表の場合ですと、正しく取得することができません。

vba_table

Sub CurrentRegionプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.Range("B2").CurrentRegion(ws.Range("B2").CurrentRegion.Count).Row

End Sub

vba_table10

最終行を取得しようとすると、うまくできません。

CurrentRegionプロパティが、指定したRangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)を取得するためです。
空白行があると、空白行の前までがアクティブセルになります。

ですので、このような場合には、前に使ったEndプロパティか、これから紹介するUsedRangeプロパティを使う必要があります。

UsedRangeプロパティを使って取得する方法

Worksheetオブジェクト.UsedRange

UsedRangeプロパティは、指定されたワークシートで使用されているセル範囲を返します。

表の最終行を取得

それではUsedRangeプロパティを使って最終行を取得します。
先ほどの空白行のある表を使います。

vba_table

Sub UsedRangeプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row

End Sub

vba_table2

最終行を取得できました。
UsedRangeプロパティでは、CurrentRegionプロパティのように引数を指定することができません。

そこで、UsedRangeのRowsプロパティに、UsedRange.Rows.Countで取得した総行数を指定して、最終行を取得します。

少し複雑で、わかりづらいかもしれまんせんが、表がどのセルから始まっていても対応できるので便利な方法です。

ただし、UsedRangeプロパティは罫線が引かれている表ですと、罫線の引かれている行が最終行になってしまうので注意が必要です。

Sub UsedRangeプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row

End Sub

vba_table11

罫線が引かれた行が最終行になっています。
このような表の最終行を取得したいときは、EndプロパティかUsedRangeプロパティを使ってください。

表の最終列を取得

最終列を取得する方法は、最終行とほぼ同じです。

Rowと指定していた箇所をColumnに変えるだけです。

Sub UsedRangeプロパティの実行例()
Dim ws As Worksheet
Set ws = Worksheets(1)

MsgBox ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column

End Sub

vba_table3
最終列が取得できました。

まとめ

今回は、表の最終行・最終列を取得する方法を紹介しました。

表の最終行・最終列を取得する方法は複数ありましたが、それぞれの方法に特徴があり、表によって使い分ける必要があることもわかっていただけたかと思います。

  • Endプロパティ
  • CurrentRegionプロパティ
  • UsedRangeプロパティ

Endプロパティを使う方法は、最終行・列を取得する方法としては、最も使われていると思います。
変則的な表でない場合は、Endプロパティで最終行・列を取得すればいいと思います。

CurrentRegionプロパティを使う方法は、Endプロパティでうまく取得できない場合(最終列にデータのないセルがる表など)に使うといいと思います。このプロパティは、表の範囲を自動で取得できるので簡単で便利です。
しかし、空白行がある表などはうまく最終行・列を取得することができません。

UsedRangeプロパティを使う方法は、表がどのセルから始まっていても対応できるので便利な方法です。
ですが、罫線引かれている場合、罫線が引かれている範囲が表となりますので注意が必要です。

このようにプロパティごとに特徴があるので、実際に業務で表を扱うときは、使っている表に合ったプロパティを使ってください!

連載目次:エクセルVBAでシートのセル範囲を簡単に取得する方法

エクセルVBAでシート上のセル範囲を取得。いつも必要になるのですが、これが意外と難しいと思われませんか? 本シリーズではシート上のデータがあるセル範囲を簡単に、そして上手に取得する方法をお伝えしていきます。
  1. 【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法
  2. 【エクセルVBA】シートで使用されているセルの範囲全てを取得する方法
  3. 【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法
  4. 【エクセルVBA】Endプロパティで表全体の範囲を取得する方法

PythonでWebページのHTML要素からテキストやリンクURLを取得する方法

$
0
0
html

photo credit: http://tvorbaweb-stranok.sk Meta and title tags in HTML code via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者かつWindowsユーザー向けということで、PythonによるWebスクレイピングの方法についてお伝えしています。

前回の記事はコチラ。

PythonでWebページからid属性を条件にして要素を取得する方法
初心者向け&Windowsユーザー向けにPythonでWebスクレイピングをする方法をお伝えしています。今回は、PythonでWebページからid属性を条件にして要素を取得する方法です。

WebページのHTMLからid属性を条件として要素を取得する方法についてお伝えしました。

これにて

  • タグ
  • class属性
  • id属性

という3つの種類で要素を絞り込むことができたわけで、これらの組み合わせだけでも、色々なパターンのHTML解析ができるのですが、欲しいのは要素ではなくて、テキストだったり、href属性(つまりURL)だったりしますよね。

ということで、今回はPythonを使って特定のHTML要素からテキストと属性データを取得する方法についてお伝えします。

では行ってみましょう。

前回のおさらい

では、まず前回のおさらいから。

作成したスクリプトはコチラです。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('#list h2')
for elem in elems:
    print(elem)

当ブログのトップページの記事一覧から記事タイトルを含む要素を取得するものです。

Beautiful Soupオブジェクトのselectメソッドを使って「list」というid名を持つ要素配下からh2タグの要素をつかむことで目的を達成しています。

今回は、さらにその取得した要素群からテキスト(つまり記事タイトル)とそのリンクURLを取得していきたいと思います。

HTML要素からテキストを取得する

Beautiful Soupオブジェクトのselectメソッドで取得できるのはHTML要素を表すTagオブジェクトのリストです。

ですから、そのTagオブジェクトひとつひとつから、テキストを抜き出せば良いということになります。

getTextメソッドでTagオブジェクトからテキストを取得する

Tagオブジェクトから、それに含まれるテキストを取得するには、getTextメソッドを使います。

Tagオブジェクト.getText()

今回の例でいうと、selectメソッドで取得したTagオブジェクトの例としては

【エクセルVBA】表の最終行・最終列を取得する方法のまとめ

となっています。h2タグの中のaタグの中に「【エクセルVBA】表の最終行・最終列を取得する方法のまとめ」が含まれていますが、h2タグに対してgetTextメソッドを使ってあげてもちゃんと目的のブツが抽出できます。

記事タイトルを出力するスクリプト

ですから、冒頭のスクリプトの7行目だけ修正して、以下のようなスクリプトにすればよさそうですよ。

import requests, bs4
res = requests.get('https://tonari-it.com';)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('#list h2')
for elem in elems:
    print(elem.getText())

実行をすると、以下のように記事タイトルだけを表示することができます。

PythonでWebページから記事一覧を取得

HTML要素から属性の値を取得する

では、続いて各記事のリンクURLを取得してみましょうか。

前述のTagオブジェクトの様子を観察すると、リンクURLは配下のaタグの中の「href=」という属性の値になっています。これはhref属性といいまして、リンクを表すaタグ(アンカータグ)のリンク参照先(Hypertext Reference)を示します。

getメソッドでTagオブジェクトから属性値を取り出す

Beautiful Soupモジュールには、Tagオブジェクトからその要素の指定の属性値を取得するgetメソッドがあります。

書き方はこうです。

Tagオブジェクト.get(属性)

ですから、href属性が欲しいのであれば

Tagオブジェクト.get(‘href’)

とすればOKです。

記事タイトルとリンクURLを出力するスクリプト

これを踏まえて各タイトルとそのURLを出力するスクリプトを作ってみましょう。

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('#list h2 a')
for elem in elems:
    print('{} ({})'.format(elem.getText(), elem.get('href')))

7行目にgetメソッドを使っています。

また、5行目も少し変えています。今回の場合、h2要素はhref属性がありませんので、h2要素の配下のaタグをselectして、それに対してgetメソッドを使うようにしています。

実行結果はコチラ。

PythonでWebページから記事タイトルとリンクURLを取得

無事に取得できました。

まとめ

PythonでHTML要素からテキストと属性値を取得する方法についてお伝えしました。

  • TagオブジェクトのgetTextメソッドでテキストを取得する
  • Tagオブジェクトのgetメソッドで属性の値を取得する

引き続き、Webスクレイピングに関するテクニックをお伝えしますね。

どうぞお楽しみに!

連載目次:初心者向け!PythonでWebスクレイピングをしよう

スクレイピングとはWebサイトから情報を集めてくること。Pythonは専用の書籍が出るくらいスクレイピングが得意です。本シリーズでは、PythonでWebスクレイピングをする方法をお伝えしていきます。

  1. Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
  2. PythonでWebページを取得できたかどうかのエラーチェックと安全な中止の仕方
  3. Pythonで取得したWebページのHTMLを解析するはじめの一歩
  4. PythonでWebページ内の特定のタグ要素をまとめて取得する
  5. PythonでWebページから特定のclass属性を持つ要素をまとめて取得する方法
  6. PythonでWebページからid属性を条件にして要素を取得する方法
  7. PythonでWebページのHTML要素からテキストやリンクURLを取得する方法

VBScriptでWEBスクレイピング!アメブロの管理画面に自動でログインする方法

$
0
0

こんにちは!あつもり(@atumori17)です。

VBScriptでIEを操作してWEBスクレイピング!の第9回目で~す。
前回は「ページ内にあるテーブル要素を取得してCSVファイルとして書き出す」ところまでやりました。

VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す
ページ内にあるテーブル要素を抜き出してCSVファイルとして書き出す方法を紹介します。CSVファイルで書き出しておけば、エクセルなどで簡単に開けるので便利ですよ。getElementsByTagNameメソッドでtr要素のコレクションを取得しFor Each文を使いtr要素、td要素を取り出していきます。

今回は「アメブロのブログ管理画面に自動でログインする」方法を紹介します。

IEを使ってアメブロのログイン画面にアクセスし、ID、パスワードを入力させ自動ログインする方法を説明していきます。

アメブロの管理画面に自動ログインするスクリプト

ではまずスクリプトの全文を紹介します。テキストエディタを開き下記のコードを入力します。全て入力し終わったら「アメブロ自動ログイン.vbs」のファイル名でデスクトップに保存します。

Option Explicit

    Dim objIE
    Dim el

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    'IEを開く
    objIE.navigate "http://kuchikomi.ameba.jp/ucs/logininput"

    'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100
    Loop

     'a要素にログインがあったらクリックする
    For each el In objIE.document.Links
        if instr(el.innerText,"ログイン") then
            el.click
            exit for
        end if
    next

    'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100
    Loop

     'IDとパスワードを入力する
     With objIE.document
        .getElementsByName("accountId")(0).Value = "TEST@gmail.com"
        .getElementsByName("password")(0).Value = "1111"
     End With

    Dim objbutton

    'button要素をコレクションとして取得
    Set objbutton = objIE.document.getElementsByTagName("button")

    'button要素にログインがあったらクリックする
    For each el In objbutton
        if instr(el.innerText,"ログイン") then
            el.click
            exit for
        end if
    next

プログラムコードの解説

全体の流れは以下のようになります。

  1. IEでアメブロのログイン画面を開く
  2. a要素をコレクションとして取得する
  3. ログインボタンをクリックする
  4. ID、パスワードを入力する
  5. button要素をコレクションとして取得する
  6. ログインボタンをクリックする

まず1ページ目はログインボタンをクリックするだけの処理を行います。すると2ページ目に遷移するので、ID、パスワードを入力し再びログインボタンをクリックするという流れになります。

次の画像を見るとイメージが沸きやすいと思います。

a要素のコレクションからログインを探しクリックする

まずはFor each文でコレクションとして取得したa要素ぶんだけ繰り返す処理を行います。続いてinnerTextプロパティでa要素をテキストとして取得し「ログイン」という文字があるかを調べます。指定した文字が含まれているかを調べるにはinstr関数を使います。

instr(要素,”検索する文字列”)

上記プログラムコードの17~23行目になります。

'a要素にログインがあったらクリックする
    For each el In objIE.document.Links
        if instr(el.innerText,"ログイン") then
            el.click
            exit for
        end if
    next

「ログイン」が見つかったらclickメソッドを使ってリンクをクリックさせます。

要素.click

最後にexit forでループから抜けます

exit for

要素をコレクションとして取得する方法については過去の記事で紹介していますので参考にしてみてください。

VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
ページ内にあるリンクURLを全て取得してテキストファイルに書き出す方法を紹介します。まずはLinksプロパティでページ全体のa要素を全て取得してから、For eachステートメントでコレクションの中の要素の数だけループさせ、リンク参照先のURLを取得します。

getElementsByNameのvalueプロパティにIDとパスワードをセットする

続いてgetElementsByNameメソッドでname属性が「accountId」「password」の要素を取得します。

HTMLドキュメント.getElementsByName(name属性名)

とすることでname属性で要素を取得することができます。下の画像はアメブロログイン画面のHTMLのソースコードです。name=”accountId“、name=”password“の部分になります。

getElementsByNameメソッドは添え字を指定する

ここで気をつけたいのが、getElementsByNameメソッドで取得した要素はコレクションなので、添え字をつける必要があるということです。name属性が同じ名前の要素が複数ある場合、ページの上から順番に配列に格納されるからです。添え字は0番から始ります。

HTMLドキュメント.getElementsByName(name属性名)(添え字)

今回のログインページでは、name=”accountId“、name=”password“はそれぞれ1つしかないので添え字は0を指定します。

getElementsByNameのvalueプロパティに値をセットする

続いてgetElementsByNameのvalueプロパティにIDとパスワードをセットします。セットする値はダブルクォーテーションで囲む必要があります。

HTMLドキュメント.getElementsByName(name属性名)(添え字).value = “セットする値”

これでIDとパスワードがセットできました。

button要素のコレクションからログインを探してクリックする

IDとパスワードがセットできましたので、今度はログインボタンを探してクリックさせます。これはgetElementsByTagNameメソッドを使い、タグ名が「button」の要素をコレクションとして取得します。

取得したコレクションから「ログイン」という文字を探してクリックさせます。先ほど説明した「a要素のコレクションからログインを探しクリックする」と同じですね。

getElementsByTagNameメソッドについては過去の記事で紹介していますので、参考にしてみてください。

VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
ページ内にあるhタグの要素全体を抜き出してHTMLファイルとして書き出す方法を紹介します。getElementsByTagNameメソッドでh要素のコレクションを取得します。取得したコレクションFor Each文で一つ一つの要素にバラしてHTMLに書き出します。

プログラムコードの解説は以上です。

アメブロ管理画面に自動ログインしてみる

では実際にアプリケーションを起動してみます。デスクトップにある「アメブロ自動ログイン.vbs」をダブルクリックします。

ログイン画面が表示されました。ここで自動でログインボタンがクリックされます。

ログインボタンがクリックされ、ID、パスワード入力画面に移りました。ここではID、パスワードが自動で入力され、その後にログインボタンがクリックされます。

おお~!無事に管理画面が表示されましたっ。めだたしめでたしです。

まとめ

今回は「アメブロのブログ管理画面に自動でログインする方法」をお伝えしてきました。いかがでしたか?

今回の内容をまとめると以下のようになります。

  • getElementsByNameはname属性で要素を取得することができる
  • getElementsByNameのvalueプロパティにID、パスワードをセットする
  • clickメソッドを使うとリンクやボタンをクリックさせることができる

以上です。それではお疲れさまでした~。

連載目次:VBScriptでお手軽WEBスクレイピング

Windowsを操作できるプログラミング言語「VBScript」を使えば、InternetExplorerを操作してWEBスクレイピングが可能です。 これで日々の情報収集はダブルクリック一発で完了させましょう!
  1. VBScriptでInternet Explorerを使って複数WEBサイトをダブルクリック一発で開く方法
  2. VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
  3. VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
  4. VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
  5. VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
  6. VBScriptでWEBスクレイピング!aタグのリンクURLをHTMLとして書き出す
  7. VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
  8. VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す

コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます

$
0
0

horse

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

先日、かの名著『ブログ飯 個性を収入に変える生き方』の著者であり、現在100人近くのメンバーを持つコミュニティ「ギガ盛りブログ飯 ~ネット発信で時代をサバイブするマル秘レシピ教えます」の主催者である染谷昌利さんのセミナー

『オンラインサロンを1年運営してわかった「コミュニティ」の重要性と作り方&維持について』

に参加しました。

すごく勉強になりました。

そして、それを受けまして、いよいよ、満を持して、コミュニティを立ち上げます。

今回、染谷さんのセミナーで勉強になったことをお伝えしつつ、どんなコミュニティを立ち上げるのか、そしてなぜ立ち上げようと思ったのかについて、お知らせせ致します。。

どんなコミュニティを立ち上げる?

「ノンプログラマーのためのスキルアップ研究会」です。

その名の通りですが、ノンプログラマーがプログラミングを中心としたスキルを身に着けることを支援をするコミュニティです。

ノンプログラマーが置かれている状況

仕事で、ITエンジニア職についていらっしゃる方であれば、社内に優秀な先輩や仲間もいて周囲や会社からの支援が得られますし、チームとして蓄積されたノウハウや資産があります。そして、何より業務時間内に仕事の中でスキルアップの機会を得ることができます。

ですが、事務・営業・マーケティングなど開発部門でない仕事に就いている皆さんは、プログラミングなどのスキルアップのための時間や環境は基本的にありません。支援や応援、ノウハウ、時間が圧倒的に不足している状態に置かれがちなんです。

でも、プログラミングのスキル、これからは重要ですよね。

そこで、一年発起して、せっかく安くない金額を使って自腹で研修に参加してみたり、書籍を購入して一歩を踏み出してみても、学ぶための時間の確保やモチベーションを維持することがすごく難しいんです。

孤独なノンプログラマーを継続的に支援する場

そんな孤独な状況に置かれているノンプログラマーの皆さんに

  • 同じ境遇の人が集まって励ましたり、助け合える場
  • 時間がない中で最短でスキルアップするノウハウ
  • 悩んだときや、困ったときの支援

などを提供することで、サポートしていきたいということです。

そして、これは独立前の私が欲しかった場でもあります。

ちなみに、対象言語は当初はVBA、GAS、Pythonで考えていますが、どちらかというとプログラムのスキルだけでなく、学び方、インプットやアウトプットの仕方や、環境の作り方や、仕事への活用の仕方やなど、もう一回り大きい範囲を対象とするつもりです。

なぜコミュニティを作ろうとを思ったか

昨年、12月まで自主開催セミナーをほぼ毎月開催していたのですが、それ以降開催できずにいます。

ブログ、WordPress、IT活用、VBA、GASなど様々なテーマで実施してきました。

しかし、実施する中で課題が2つありました。

収支の問題

一つは、正直なところ収支の問題です。

私の実力不足が原因なので申し訳ないのですが、毎回新規のお客様に来ていただく必要があるので、収支が読みづらい…というか、会場費や交通費、食事代など実費で出ていく経費はもちろん、自らの人件費を考えると、赤字になってしまうことが多くありました。

直接コミュニケーションを取りながら学んでいただくのは、サービスとして価値があると信じつつも、その持続可能性を保つのが難しいという状況でした。

参加者のその後の問題

もう一つは、参加者の「その後」です。

セミナーが終わった瞬間では、スキルも身に着けていただき、アンケートからも満足いただけていることが読み取れました。

ただし、人は忘れる生き物。以下記事に書いている通り

一生懸命覚えたことも一週間経てば4分の3を忘れてしまうのです。

平日にスキルアップの時間や機会をとることが大切な理由とそのためのテクニック
自分の仕事の幅を広げたり、有事のときの備えとするために、スキルアップしたい、勉強をしたい!今回の記事では、平日を使ってスキルアップをする理由と、その時間を確保するためのテクニックについてお伝えします。

せっかく研修を受けて学んでも、それを日々で使わなければ忘れてしまいます。そして前述の通り、多くのビジネスマン、とくに初心者は「日々で触れる」ことが難しい。

それで、せっかくお金を払って、そして時間も使って参加したセミナーで学んだことが、いっさい忘却の彼方に…ということも。

セミナーのサービスの価値ってなんだろ?

そう思い、とどまってしまったのが、もう今から10カ月も前でした。

「継続」が壁を超える鍵

この二つの課題を解決する鍵は「継続」というキーワードであることは間違いありません。

そして、『オンラインサロン』という新しい形態が、それを達成する一つの手段としてありそうだということは理解していました。

ですが、オンラインサロンってイケハヤさんとか、堀江さんとか、絶大なオピニオンリーダーが、そこでしか得られない情報や考え方を提供していくというイメージがありましたので、なんとなくタイプが違うなぁと思いつつ…

一方で、いくつか興味があるサロンにいくつか参加してみたんですけど、はっきりいってコンテンツスカスカで…オンラインサロンへの信頼も薄まってしまいました。

自分がうまく価値提供できるイメージがなかなか沸かなかったんですね。

そんなモヤモヤもありつつも、それだけでなく、以下のような疑問が続々。

  • 継続課金…選択肢が少ない、料率高い、ってかオンラインサロンってどうなの?
  • 会費いくらにすればいいの?
  • オンライン…何を提供すればいいの?
  • 自分が先生、みんなが生徒…メンバー増えたら質問地獄でパンパンになるのでは?

ふーむ…いっぱいありますね。問題点。

ギガ盛りサロンのセミナーで埋まったパーツ

それらを一切合切解決してくれたのが、今回の染谷さんのセミナー『オンラインサロンを1年運営してわかった「コミュニティ」の重要性と作り方&維持について』でした。

目からウロコだった点をピックアップします。

「ギガ盛り」はオフライン重視

「ギガ盛り」はオフラインのセミナーが中心で、オンラインはサポートなのだそうです。

これで、一気にイメージがくっきりしました。

だって、月1回のセミナーをやって、その間をサポートするのがオフラインでのやり取り。

…これは、私が企業向けの研修でやっていることと一緒だったんです。なんで気が付かなかったんだろ…、と思いました。

だから、オンラインサロンはおそらく継続決済と会員管理とオフラインを埋める役割を担ってくれるものと割り切ればかなりスッキリします。

あと、オフラインがメインだと人数の増加にも耐えやすいと考えました。

というのも、資料の準備や会場の手配に関するマンパワーは、会場が大きくなってもそれほど変わらないからです。

仕事やチャンスを提供する

「ギガ盛り」ではメンバーに仕事や、出版やライティング、取材などのチャンスを提供しています。

これは、ノウハウ以上に魅力的です。

というか、私の中で、参加してくださるメンバーにお支払い頂いた分の価値提供を、ちゃんとしなければというプレッシャーがありました。

ですが、サービスとしてスキルアップという点だけでなく、仕事、ライティング、登壇、その他…新たな機会の提供もできる。

その結果、報酬が入ってくるのであれば、会費の何か月分かになってしまったり。

これは、提供する価値としては魅力的に思ってもらえるのではないかと思います。

リーダーはポンコツ感を出すと良い

このフレーズ以外にも、「無謀な人」とか、「好きなことだけやればいい」とか、染谷さんの話のあちこちに「ゆるさがポイント」ととれるような内容が含まれていたように思います。

ここは、けっこう自分の解釈として言語化するには、自分でやらないと難しいのではないかと思います。

が、まじめに完璧を求めてやりすぎると良くなさそう、肩の力を抜いてニュートラルでい続けるほうが良さそう、というのはよくわかりました。

スライド・音声などのデータ類をストック

オンラインでスライドや音声などのデータを全てストックされているそうです。

後から入ったメンバーも過去のスライドや音声を全て閲覧することができる…これは良いアイデア…!

人数が増え、提供できる価値が増えているので、支払っていただくそれなりの金額にも耐えうるようになる、と。

できれば、動画を撮っておきたいなんて思っちゃいました。

まとめ

今回のセミナーのおかげで、今までモヤモヤしたものが、ほとんど吹き飛んでしまいました。

リアルもオンラインサロンも含めたコミュニティのセミナーって見たことないので、すごく貴重な機会だったと思います。

マジ、ありがたい…!

コミュニティ設立についてご興味ある方は、染谷さんの以下記事をご覧いただくのがよいと思います。

コミュニティの作り方を解説します。あなたのコミュニティにメッセージはありますか?
これからの時代、自分を中心としたコミュニティを創っておくことが重要です。その創り方を解説します。

さて、先日、さっそく某オンラインサロンに申請をしたところです。

「ノンプログラマーのためのスキルアップ研究会」

(申請が通れば)準備が整い次第公開をしていきたいと思います。

進捗はこのブログを含めて、TwitterやFacebookなどで逐一ご報告できればと思います。

ご興味ある方はぜひフォローを下さいませ!

Pythonでリストの値をカウントをする超簡単なプログラム~辞書とは何か、またその使い方

$
0
0
dictionary

photo credit: Melinda Young Stuart Insects of America via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

当ブログでは、非エンジニア&Windowsユーザーのためのお仕事へのPython活用法について色々とお伝えしております。

さて、今回のテーマはカウントです。

テキスト、csv、Excel…仕事では色々な形式のデータを取り扱いますが、カウントすること多いですよね。

普通はエクセルを使って、COUNTIF関数とか使って集計するのですが、Pythonで「辞書」というタイプのデータを使うと、エクセル立ち上げなくてもサクっと集計できちゃったりします。

今回から、その辞書の便利な使い方を初心者向けにお伝えしていきます。

まず、手始めとしてPythonの辞書とは何か、また辞書を使ったリストの値のカウントをする超簡単なスクリプトについてお伝えします。

では、行ってみましょう!

おにぎりの出現回数を知りたい

例えば、以下のようなリストがあるとします。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']

各おにぎりの種類ごとに、何回登場するかカウントをするプログラムを作りたいのです。

どのようにしますか?

…というのが今回のお題です。

答えを出しちゃいますと、例えばこんなスクリプトを作ればOKです。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {'シャケ': 0, 'ツナ': 0 ,'コンブ': 0, 'オカカ': 0}
for onigiri in onigiris:
    count[onigiri] +=1
print(count)

スクリプトを実行すると

Pythonで辞書をprintする

という結果が得られます。

辞書とは何か

辞書というのは、値の集合を扱うデータ型で、含まれる値をkeyと呼ばれる文字列と紐づけた形で格納をすることができます。

そして、その格納されている値をvalueと言います。

key: value

リストはインデックスと呼ばれる数値に紐づけて値を格納できましたが、辞書の場合は好きな文字列を指定できるのです。

例えば、以下の辞書であれば、’シャケ’というキーで4という数値を、’ツナ’というキーで3という数値を…という形で保管しています。

{'シャケ': 4, 'ツナ': 3, 'コンブ': 2, 'オカカ': 1}

値は数値だけなく、文字列や他のデータ型でもOKです。

辞書の記述の方法

冒頭のスクリプトでいうと、2行目が辞書を作成している命令になります。

count = {'シャケ': 0, 'ツナ': 0 ,'コンブ': 0, 'オカカ': 0}

辞書を記述する場合は、全体を波括弧で囲み、「key: value」という形式で、カンマ区切りで指定をします。

変数名 = {key1: value1, key2: value2, …}

ですから、2行目では「シャケ」「ツナ」「コンブ」「オカカ」の各キーに対して0という数値を格納していて辞書を作成して、countという変数に代入しているということになります。

ちなみに、この形式は、他のプログラム言語では、「オブジェクト形式」ともいわれたりしますね。

辞書の値の参照

辞書の値を参照するには、以下のように辞書が格納される変数名に続けて、各括弧内にキーを指定します。

変数名[キー]

この表現を用いて、辞書の値を代入することができ、それを行っているのがスクリプトの4行目の以下の部分です。

count[onigiri] +=1

変数onigiriが示すキーに対応する値をプラス1しているというわけです。

まとめ

Pythonで辞書を使ってリストの値をカウントする超簡単なスクリプトを紹介しました。

  • 辞書はkeyとvalueの組み合わせで複数の値を取り扱うデータ形式
  • 辞書の記述は波括弧内に、key: valueの組み合わせをカンマ区切りで指定する
  • 変数名に続けて各括弧内にキーを指定することで値を参照する

さて、辞書もリストのようにfor文でループ処理をすることができます。

次回はその方法をお伝えしていきます。

どうぞお楽しみに!

Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

非エンジニア&Windowsユーザー向けにPythonで辞書を使った便利な集計ツールの作り方をお伝えしております。

前回の記事はコチラ。

Pythonでリストの値をカウントをする超簡単なプログラム~辞書とは何か、またその使い方
非エンジニア&Windowsユーザーのためのお仕事へのPython活用法お伝えしております。今回は、Pythonの辞書とは何か、また辞書を使ったリストの値のカウントをする超簡単なスクリプトについてです。

リストの値をカウントして辞書にまとめる超簡単な方法をお伝えしました。

今回はその続きで、そのまとめた辞書をループする方法です。

このテクニックも超基本なはずです。

では、Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方です。

行ってみましょう!

前回のおさらい

では、まず前回のおさらいから入ります。

作成したスクリプトはコチラ。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {'シャケ': 0, 'ツナ': 0 ,'コンブ': 0, 'オカカ': 0}
for onigiri in onigiris:
    count[onigiri] +=1
print(count)

リスト内のおにぎりの種類ごとに、何回登場したかをカウントして辞書としてまとめるというスクリプトです。

一応、countという変数に辞書としてまとまっていて、出力すると以下のように中身を見ることができます。

Pythonで辞書をprintする

ですが、実際はこの形式じゃない出力がしたいときもありますよね。

それをforループを使った成し遂げたいというのが、今回のお題になります。

keysメソッド・valuesメソッド・itemsメソッド

辞書に対するループを考える際に、keysメソッド・valuesメソッド・itemsメソッドについては語らざるを得ませんのでお伝えします。

そして、以下のような役割を持ちます。

  • keysメソッド:辞書からキーのリストを表すdict_keysオブジェクトを返す
  • valuesメソッド:辞書から値のリストを表すdict_valuesオブジェクトを返す
  • itemsメソッド:辞書からキーと値のペアのリストを表すdict_itemsオブジェクトを返す

そして、dict_keysオブジェクト、dict_valuesオブジェクト、dict_itemsオブジェクトはいずれもイテレート可能なオブジェクト、つまりforループの対象として使用することができます。

では、それぞれ見ていきましょう。

辞書のキーについてループする

keysメソッドの書式はコチラです。

辞書.keys()

ですから、例えば辞書のキーのリストを表示するのであれば、以下のような命令になります。

for key in count.keys():
    print(key)

これによる出力はコチラです。

Pythonで辞書のキーのリストを出力する

サクっと作れちゃいますね。

辞書の値についてループする

続いて、valuesメソッドです。

辞書.values()

辞書の値についてループするのであれば、以下のような命令になります。

for value in count.values():
    print(value)

実行結果はコチラ。

Pythonで辞書の値のリストを出力する

オッケーですね。

辞書のキーと値のペアについてループする

多分、このパターンが一番便利で使うことが多いかもです。itemsメソッドです。

辞書.items()

itemsメソッドでは、キーと値のペアについて両方を取り出しながらループできまして、以下のように書きます。

for key, value in count.items():
    print('{}: {}'.format(key, value))

実行してみましょう。

Pythonで辞書のキーと値のペアについて出力する

うわ、便利!

まとめ

Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方についてお伝えしました。

  • 辞書のキーや値のリストを表すオブジェクトを取得する方法
  • 辞書についてキーや値、またはそのペアを取り出しながらループをする方法

Pythonのfor文、とても便利ですね!

次回は、csvファイルのデータを辞書に集計する方法をお伝えします。

どうぞお楽しみに!

連載目次:初心者向けPythonで辞書を使った集計ツールの作り方

Pythonの「辞書」を使うことで、カウントや計算などの集計作業を簡単に行うことができます。本シリーズでは、辞書とは何かというところから実際にcsvファイルを集計するツールを作るところまでを伝えしていきます。

  1. Pythonでリストの値をカウントをする超簡単なプログラム~辞書とは何か、またその使い方
  2. Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方

【エクセルVBA】表の範囲全体に格子状の罫線を引く最も簡単な方法

$
0
0

office-620817_1280
みなさん、こんにちは。
なかじ(@nakaji098)です。

これまで表の範囲に取得する方法をいくつか紹介してきました。

今回からは、表に罫線を引く方法などについて、いくつかご紹介していきたいと思います。

罫線を引く方法も複数あり、状況によって使い分ける必要があります。

今回は、『表の範囲全体に格子状の罫線を引く最も簡単な方法』についてです。
表のデータ入力をエクセルVBAで自動化しても、手動で表に罫線を引いていたらもったいないですね。

表に罫線を引く方法を身につけて、データ入力から表を作成するまでを自動化して業務を効率化しましょう。

表の範囲を取得する方法

表の範囲を取得する方法は、これまでに紹介したものが3つあります。

  • CurrentRegionプロパティを使う方法
  • UsedRangeプロパティを使う方法
  • Endプロパティを使う方法

それぞれのプロパティに特徴があり、表の形式によって使い分ける必要があります。

CurrentRegionプロパティ

今回は、CurrentRegionプロパティを使って、表の範囲全体に格子状の罫線を引いていこうと思います。

なので、まずはCurrentRegionプロパティの説明を簡単にします。

以前の記事も参考にしてください。

【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法
表の範囲をRangeプロパティで直接指定することでも表に処理を行うことは可能です。しかし、データは日々更新され、表の範囲も変わっていきます。そんな問題を解決してくれるのがCurrentRegionプロパティです。
Rangeオブジェクト.CurrentRegion

このプロパティを使用することで、指定したRangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)を取得することができます。

実際にCurrentRegionプロパティを使った例です。

このような表の範囲全体を取得します。
borders1

実際のコードです。

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

表範囲選択

表の範囲全体が指定されました。

CurrentRegionを使えば、このように表の範囲を簡単に取得することができます。
ただし、表に空白行がある場合などは、空白行の前までがアクティブセル(表の範囲)となってしまいますので気をつけてください。

罫線を引く方法

罫線を引くには、BordersプロパティLineStyleプロパティを使います。

Rangeオブジェクト.Borders.LineStyle = xlContinuous

Bordersプロパティでは、線を引く場所を、LineStyleプロパティは罫線の種類を指定します。

【Borders.Linstyle(xlContinuous)】のように指定するのではなく、【Borders.Linstyle = xlContinuous】のように指定します。
xlContinuousは線の種類を指定する値で、実線を意味します。

これらのプロパティで線を引く場所や罫線の種類を選ぶことができますが、詳しい説明は次回以降の記事でしたいと思います。

ここでは、、【Borders.Linstyle = xlContinuous】とすることで罫線が引けることを覚えておいてください。

セルに罫線を引く

それでは、セルに罫線を引く方法を紹介していきたいと思います。

まず、白紙の状態のシートのB2セルに罫線を引いてみます。

Sub セルに罫線を引く()
Worksheets(1).Range("B2").Borders.LineStyle = xlContinuous
End Sub

borders2

B2セルが罫線で囲まれました!

【Rangeオブジェクト.Borders.LineStyle = xlContinuous】とすることで、指定したセルを罫線で囲むことができます。

2つのセルに罫線を引く

こんどはB2セルとB3セルに罫線を引きます。

Sub セルに罫線を引く()
Worksheets(1).Range("B2:B3").Borders.LineStyle = xlContinuous
End Sub

borders3

B2セルとB3セルに罫線が引かれました。

このように指定する範囲を広げると、指定された範囲に罫線が引かれます。

表の範囲全体に格子状の罫線を最も簡単に引く方法

それでは、今回のテーマである『表の範囲に格子状の罫線を最も簡単に引く方法』です。

ここまでの説明で、どのようなコードを書けばいいのかは、だいたい想像がついていると思います。

それでは実際に、表に罫線を引いていきます。

先ほども使った、こちらの表に罫線を引きます。
borders1

実際のコードがこちらです。

Sub 表全体に格子状の罫線を引く()
Worksheets(1).Range("B2").CurrentRegion.Borders.LineStyle = xlContinuous
End Sub

borders4

表全体に格子状の罫線が引かれました!

表の範囲を取得した箇所以外は、セルに罫線を引く方法で紹介したものと同じです。
表の範囲全体をCurrentRegionプロパティで指定し、その範囲に罫線を引いています。

このように表に格子状の線を引きたい場合は、セルの範囲を指定し、【Borders.LineStyle = xlContinuous】となります。

この方法を見ると、「表の範囲全体を罫線が囲むのではないか」と思うかもしれません。
2つのセルに罫線を引いたときのように、「指定した表の範囲の各セルに罫線を引いた」とイメージすると理解しやすいと思います。

まとめ

今回は、『表の範囲に格子状の罫線を最も簡単に引く方法』についてでした。

CurrentRegionプロパティを使って表の範囲を取得し、その表に格子状の罫線を引きました
表に罫線が引かれることで、データの集まりだったものが、いっきに表らしくなります。

今回紹介した、表に格子状の罫線を引く方法は、実務で使う機会がある方も多いのではないでしょうか。
次の記事では、罫線の種類を変えたり、罫線を引く場所を指定する方法を紹介できればと思います。

Pythonで辞書にキーが存在していなければキーと値を新たに追加する方法

$
0
0
dictionary

photo credit: grits2go New York Public Library via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

初心者&Windowsユーザー向けに、Pythonで辞書を使った集計ツールの作り方をお伝えしています。

前回の記事はコチラです。

Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方
非エンジニア&Windowsユーザー向けにPythonで辞書を使った便利な集計ツールの作り方をお伝えしております。Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方です。

辞書に対してforループで繰り返し処理をする方法をお伝えしました。

ところで、リストの値についてその登場回数をカウントするツールを作っているわけですが、辞書のキーとして存在していない値が登場してしまったときはどうしましょうか…?

今回は、その点を解決していきたいと思います。

つまり、辞書に指定したキーが存在するかどうかを判定して、存在しなければ辞書のキーとして追加をするという処理が必要になります。

では、Pythonで辞書にキーが存在しているかを判定する方法です。

では、行ってみましょう!

前回のおさらい

では、まず前回のおさらいからです。

作成したスクリプトはコチラです。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {'シャケ': 0, 'ツナ': 0 ,'コンブ': 0, 'オカカ': 0}
for onigiri in onigiris:
    count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))

リストを走査しておにぎりの種類ごとにその登場回数を調べるというものです。

今回、2行目を以下のように、空の辞書の定義に変更しちゃいます。

count = {}

それで、そのまま実行すると以下のように「シャケ」がないよなどと怒られてしまいます。

Pythonで存在しないキーを操作しようとしたエラー

KeyError: ‘シャケ’

これをうまく動くように修正していきましょう。

キーが存在するか判定するif文

判定文なのでif文が使えそうですよね。

Pythonで条件分岐をする基本中の基本!if~else文の作り方
初心者向けにフォルダ作成ツールを題材としてPythonプログラミングの基本を学んでいます。今回はPythonで条件式による条件分岐をする基本中の基本、if~else文を使う方法をお伝えします。

それで、辞書に特定のキーが含まれているかどうかは、以下の構文で判定をすることができます。

if キー in 辞書.keys():
 # 処理

not演算子で条件式を反転する

ですから、今回の場合は

  • 辞書countのキーにおにぎりの種類が含まれていなければ
    • 新たにキーを追加して、その値を1にする

とすればよいわけです。

今回は「含まれていない」ですので、not演算子を使って

if キー not in 辞書.keys():
 # 処理

とします。

キーが含まれていなければ追加するスクリプト

スクリプトとしては以下のようになります。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {}
for onigiri in onigiris:
    if onigiri not in count.keys():
        count[onigiri] = 0
    count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))

これにて、以下のようにバッチリ集計が可能になります。

Pythonでリストの集計をした結果

setdefaultメソッドでキーが存在しない場合のみ追加する

ですが、実はPython。

辞書にキーが存在しないときにのみキーと値のペアを新規追加するという、なんともアメージングなメソッドがあるのです。

以下のsetdefaultメソッドです。

辞書.setdefault(キー, 値)

前述のスクリプトの

if onigiri not in count.keys():
    count[onigiri] = 0

という部分を、1行で表現できてしまうということになります。

setdefaultメソッドを使用したスクリプト

setdefaultメソッドを使ってスクリプトを書き換えると、以下のようになります。

onigiris = ['シャケ', 'ツナ', 'ツナ', 'コンブ', 'シャケ', 'オカカ', 'シャケ', 'ツナ', 'コンブ', 'シャケ']
count = {}
for onigiri in onigiris:
    count.setdefault(onigiri, 0)
    count[onigiri] +=1
for key, value in count.items():
    print('{}: {}'.format(key, value))

ネストが減るのはありがたいですよね。

まとめ

以上、Pythonで辞書にキーが存在するか判定する方法、存在していなときにキーを新たに追加する方法についてお伝えしました。

  • if文で辞書に指定したキーが存在するか判定をする
  • not演算子を使って「含まれない」を判定する
  • setdefaultメソッドでキーが存在していないときにキーと値を追加する

さて、次回は集計対象をリストではなくて、csvファイルにしたいと思います。

どうぞお楽しみに!

連載目次:初心者向けPythonで辞書を使った集計ツールの作り方

Pythonの「辞書」を使うことで、カウントや計算などの集計作業を簡単に行うことができます。本シリーズでは、辞書とは何かというところから実際にcsvファイルを集計するツールを作るところまでを伝えしていきます。

  1. Pythonでリストの値をカウントをする超簡単なプログラム~辞書とは何か、またその使い方
  2. Pythonで辞書をforループするkeysメソッド・valuesメソッド・itemsメソッドの使い方
  3. Pythonで辞書にキーが存在していなければキーと値を新たに追加する方法

Pythonを学ぶならオンラインサービス「PyQ」!写経と圧倒的ボリュームで確実に身に着ける

$
0
0

PyQトップビジュアル

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

当ブログでもPythonを業務に活用する方法についての記事を初心者&Windowsユーザー向けにお伝えしています。

さて、そんなPythonですが、学ぶためにはブログ以外に、体系的に学べる書籍やオンラインサービスなどと組み合わせるのがオススメです。

(どんなプログラミング言語でもそうですね)

そこで、今回は「PyQ™(パイキュー)」というPython専門の硬派なオンラインサービスについて試してみましたので、その特徴やオススメのポイントをお伝えしたいと思います。

キーワードは「写経」と「圧倒的ボリューム」です。

では、行ってみましょう。

PyQとは

PyQはPythonに特化したオンラインサービスです。

今、オンラインでプログラミングを学べるサービスは

  1. 動画を観て学ぶ動画系
  2. 実際のプログラミング画面で模して演習をしながら進める演習系
  3. ゲームを進めながら学ぶゲーム系

などのタイプがありますが、PyQは「演習系」に属するタイプです。

演習系の中でも、かわいいキャラクターとイラストを使った親しみやすいものから、がっつり硬派なものまでありますが、PyQは

本気でプログラミングを学びたいあなたへ

とあるように、バッチリ硬派と言えます。

PyQのプランは?

無料からのコースがあるオンラインサービスもありますが、PyQは2,980円/月~の有料サービスです。

PyQの個人プランは以下の通りです。

  • ライト:2,980円
  • スタンダード:7,980円
  • メンター:29,800円
  • プレミアム:98,000円

PyQの料金・プラン

無料だと気軽に始められる分、「今日はやんなくていいかな…」など先延ばしにしちゃったりすることもあり得ます。

PyQはプランを見てもわかる通り、確実に身に着けたい人向けですね。

とはいえ、有料だとしても、ものすごいお得ですよ。なぜそう思うかは、後ほどお伝えします。

PyQでの学習のイメージ

PyQの学習コースをみてみると、まずPython初心者向けのコースがこの二つ。

  • 未経験からのPython文法:82時間~
  • プログラマー向けPython文法:75時間~

「Pythonを学ぼう」の2コース

これ、1日1時間やっても3カ月かかりますよ…。

そして、このどちらかが終わった暁には、以下のコースが待ち受けています。

  • Webアプリ・API:48時間~
  • データ分析・機械学習入門:29時間~
  • スクレイピング:4時間~
  • 実務で役立つPython:30時間~

「実務で活かすPython」の4コース

こちらは全部やろうと思ったら、111時間~…1日1時間でも最短4カ月くらいかかりますよ…どんだけコンテンツ充実しているんだPyQというところです。

PyQを試してみよう

さて、ともあれ試してみよう!ということで、ライトコース2,980円にて、「未経験からのPython文法」コースを進めてみました。

コースに入ると大きく分けて

  • Pythonはじめの一歩
  • Python初級
  • Python中級

という段階に分かれていて、さらにその中は「print()、変数」「list,for文」などのセンテンスに分かれています。

PyQで学習するクエスト

途中をつまみ食いしながら進めることもできますが、基本的には順番に進めればよいようになっています。

しかしこれ…中級まででもかなり網羅されている感じがしますね。もっと先のコンテンツもあることに驚きです。

PyQの画面構成

では、実際に演習を進めてみましょう。

「print()、変数」の最初の演習です。

PyQの演習画面は以下のように、左側の解説を読みながら、右側のエリアにコードを入力・編集していくような形になっています。

PyQの画面構成

…ていうか、最初の問題から難しくないっすか…?!

と呆然としてしまうかも知れませんが、慌ててはいけません。

写経をしよう

解説を読むと書いてありますよ。

写経しよう

写経、つまり書き写せば良いのです。それならできます。でも意味を一生懸命考えながら書き写すのがミソです。なにせ「写経」ですから心をこめて。

Pythonで写経をしよう

そして、写経が終わったら右上のボタンで実行。すると、実行結果が表示されます。

PyQでプログラムを実行

実行結果が問題ないと思ったら、今度は「判定」ボタンをクリック。

PyQでプログラムの判定エラー

あれ、間違えましたね。

ですが、判定でどこが違うかも表示されますし、解説もありますので、途方に暮れることなく解決に歩を進めることがでるはずです。

判定で合格になりました。

PyQでクエスト完了

これが1つの演習の流れになります。

PyQがオススメの理由

写経をがっつり組み込んだサイクル

先ほど、最初の演習を終えた「print()、変数」の構成なのですが、以下のようになっています。

PyQの学習の流れ

つまり、以下のような流れです。

  1. 最初の写経
    • ひとまずわからなくても書き写すこと、動作を確認する
  2. 登場した新たな文法を学ぶ
    • 新たな文法を一つずつ、写経と解説を交えながら、かなり丁寧に学ぶ
  3. 自力で解く
    • 最初に写経したもの(+α)を自力で解く

これが、各項目でだいたい同じような構成になっていて「写経」→「解説」→「自力」→…というサイクルです。

多くのオンラインコンテンツは動画系にせよ、演習系にせよ、一度過ぎたものを振り返ることが少ないので、「わかった気になっている」ことも多かったりします。

ですが、PyQの写経をがっつり組み込んだサイクルであれば、より確実に身につくというわけです。

圧倒的なボリューム

また、一つのことを学ぶのに演習の数がとにかく多いです。print()と変数を学ぶだけで、19問もあるんです…ボリュームがすごい。

それで、私。まじめに全部進めているんですが、10/11に登録して10/31現在まで20日間のうち、6時間かけてようやく「はじめの一歩」が終わりました。

Pythonの初歩の部分はある程度理解しているので、かなりかっ飛ばしているのですが…

以下の通り、ようやく「関数」が登場しました。

PyQの現時点の私の状況

どんだけのボリュームなんだ…。

なので、2,980円は圧倒的に安いのです。どれだけ進めても2,980円ですから。

まとめ

以上、オンラインサービスPyQとその特徴についてお伝えしてきました。

まとめますと、PyQは

  • Pythonを本気で学ぶための硬派なオンラインサービス
  • 写経をがっつり組み込んだ、確実に一つずつ学ぶ構成
  • 月2,980円で実務で使えるレベルまで圧倒的なコンテンツボリュームを学べる
  • 困ったらスタンダードやメンターに助けを求められる

というサービスです。

個人的にオススメというか、「私だったらこうする」のパターンは、ライトコースでダーッと進めて、わからないことをストックしていき、わからないことが増えて「もうだめだ―」と思ったら、その時点でスタンダード(余裕があればメンター)にプランを変更するという作戦です。

スタンダードでは翌日にお返事いただけるっぽいので、それで順調に解決をしていき1か月後に「腑に落ち」してきたらまたライトコースに戻る、そんな使い方が良さそうだなと思いました。

いずれにしても、コンテンツを終わらせるのには半年以上は間違いなくかかりそうなので、腰を据えて向き合うと良いです。

そして、それくらいやったら、確実にステップアップすると思いますし、転職するときに「PyQを100時間やりました」とか言ったら、間違いなくポイントつきそうですよね。人生変わるイメージできます。

では、私も引き続き、先を進めていきます。


Google Apps Script活用ミートアップで話したこと・学んだこと #GAS活

$
0
0

Google Apps Script活用ミートアップ登壇の様子

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

先日、ガイアックス様主催のエンジニア交流会にて登壇をしてまいりました。なんとテーマは「Google Apps Script活用ミートアップ」

イベントページはコチラ

なんとガイアックスのnorinuxさん(@norinux)にTwitterでお声がけいただいて、今回の登壇が決まりました。

私、基本的に一人で活動をしていますし、GASのことを語らい合うなんて機会はとても少ないので…それは、もう…

楽しかった!!

ということで、“GAS活”にて話したことと学んだことについて、レポートをさせて頂きます。

ちなみに、写真はガイアックスのOGATA Tetsujiさん(@xtetsuji)許可をいただいてお借りしております。

では、行ってみましょう。

Google Apps Scriptのユーザーってどんな人?

登壇のお声がけをいただいたのが10/18ですから、ちょうどイベントの2週間前。

イベントの趣旨をお伺いして、テーマもGASですし参加しない手はないのですが、いざ登壇をするとなると

「何を話せばいいの?」

となります。事前情報では、PMや情シスの方が多いのでは?というヒントを頂いていたのですが「エンジニア交流会」ですので、ゴリゴリのエンジニアの方ばかり集まってしまう気もしなくもない…

そうなんです。

ゴリゴリのITエンジニアから、ITから遠そうな管理部門の方まで、当然その間を埋める情シスの方々…GASのユーザー層ってかなり広いんですね。

それで、実際に参加してみるとまさにその通り。

参加した方々の職種もスキルレベルも様々でしたし、スピーチの内容も多岐に渡ります。

開発力のある方はPythonと組み合わせたり、APIとガンガン連携したり…一方で最近学び始めたとしても、自動でドキュメントのひな形をつくるツールや、備品の発注ダッシュボタンを作ったり…すごくその用途が幅広いんですね。

登壇でいうとターゲットが絞りづらいという難点があることに気づきましたが、利用者の職種が広いっていうのは、他の言語にはない面白さがあると感じました。

『壁』を超える鍵としてのGAS

それで、私のスピーチなのですが、私らしさを出したほうがいいかなと思いまして、以下の内容にしました。

まあ、高い技術を提供するというよりは、ITリテラシーがあまり高くない方々にいかに技術を提供するか、というところにテーマをおいてますので、そこを出したほうが良いかなということで。

以下で、スライドの内容を簡単に補足しますね。

中小企業がIT導入で失敗する理由

中小企業がIT導入で失敗する理由は、一言でいうと「導入だけして運用をしないこと」によることが多いんですね。

お金を払った→導入した→だから価値が得られる、そう考えていらっしゃるのですが、実はそうではありません。

システムの価値は納品時が価値がMAXで、外部環境や内部環境の変化により、その価値は低下する一方です。

なので、お金を払った→導入した→そして正しく運用をし続けることで→ようやく価値が得られるんですね。

導入のお金とリソースは想定しているのですが、運用のお金とリソースを想定していないんです。

想定できたとしても、運用も外部に依頼するのは毎月の固定費となってしまうので、ショットで払いきるよりも経営に重くのしかかるので、できればやりたくない。

だから失敗します。

GASなら社内で運用する体制を作れる

スライドで書いている通り、GASであれば

  1. G Suiteとその拡張で 中小企業がやりたいことはたいがいできる
  2. 全てGoogleのクラウドにあるので準備が不要
  3. 無料ではじめられる
  4. JavaScriptベースなのでジョブチェンジに強い人材を育成できる
  5. 業務にそのまま活用して時間を生み出せる

という理由から、導入のハードルが低く、社内でなんとかする体制を作りやすいんですね。

ただ、技術の部分はどうしても習得が必要なので、そこで弊社ではシステム導入とセットで研修などスキルアップのお手伝いをしているということになります。

交流会でもお話したのですが、社内で1~2人でも「できる人」が育成できれば、あとはその方をハブにして、他のスタッフにも教育をすることができちゃったりします。

これってものすごく価値があると思います。

おそらく、中小企業でいうとG SuiteとGAS導入が、IT活用の壁を超える最大の鍵になるケースが多いはずです。

GASで気をつけること

ただ、気を付けるべき点がありますので、ご一読を。

他のスピーカーの皆さんもおっしゃっていたんですが、まずは「実行時間6分の壁」です。

他にもGASならではの気を付けるポイントはいくつかあります。

  • 容量と制限
    • メール、トリガー、他…
  • スクリプト・トリガー・ライブラリの管理
  • シートの構成をいじっちゃうユーザー
  • ドメイン間で譲渡ができない

このあたりは最初にきちんと知っていれば対応はできるものですので、事前に確認しておきましょう。

会社っていいな、と思ってしまったこと

サラリーマンとか会社という組織でどうしてもうまくいかなかったので独立したようなものなので、「独立のほうがいい」などといつも思ってしまいがちな私なのですが、実は不覚にも「会社っていいな」って思ってしまいました。

イベントスペースがうらやましい

まず、こちらの写真をご覧ください。

イベントスペースGRID地下1F

こんな素敵なスペースが使えるという点です。永田町から徒歩2分ですよ。

今、オフラインの活動を重視したコミュニティを設立しようとしているものですから。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます
コミュニティ「ギガ盛りブログ飯」の主催者である、染谷昌利さんの「コミュニティの作り方」についてのセミナーに参加しました。それを受けまして、コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます。

ほんとスペースが悩ましい。一回借りると数万円かかりますでしょ。ひと月3回やったら10万超えですよ。大変。

どなたか

  • 平日夜に使える40~50人くらい入れるセミナー用のスペース
  • 土日に使える10人程度のキャパシティのモクモク会用のスペース

のオススメ情報、お得情報、ご協力情報がありましたら、TwitterFacebookもしくは、以下問い合わせにて、ぜひご連絡くださいませ…!

株式会社プランノーツのお問い合わせページです。月額オンラインサポート、Webサイト制作やシステム開発、コンサルティングなどのお申込み、お仕事のご依頼・ご相談などお気軽にご連絡下さい。

話がそれてしまいましたが、この規模感は組織ではないと難しいですよね。うらやましい…。

仲間がうらやましい

場所もそうなのですが、それ以上に良い仲間が集まるのって強いな~って。

ガイアックスの冨士松さんのLTにて、ペアプロのお話があったんですね。

ペアプロとはペアプログラミング、例えば先輩と後輩などのスキルに差がある同士で、かわりばんこにプログラミングをする手法です。

30分交代で3時間ってお話だったと思います。

…めちゃめちゃスキル伸びると思うんですが、どうです?

ちょっと調べたら、以下のような記事も。

この問いに対して、自分なりの答えを言語化できたのでまとめます。

あと、それ以上に重要なこととして

絶対楽しい…!

楽しいって結構重要で、つまらないことって継続しづらいので、楽しいに越したことはないんですよね。

仲間の重要性みたいな点も、個人的には大きな学びになりました。

まとめ

さて、GASのイベントは初めて参加&登壇したのですが、とても楽しく発見もありました。

ガイアックスさんのお話では、また”GAS活”をやろうとのことでしたので、期待…!

もちろん、自らの活動やこれからスタートをするコミュニティにも有用な学びもありました。

引き続き、皆さんがITやプログラミングを楽しんで学べるお手伝いを、企業への支援やコミュニティを通じて頑張っていきます。

Monacaで最初っからアプリ完成までを簡単なカメラアプリで体験してみよう!

$
0
0
camera

photo credit: Wiertz Sébastien Polaroid SX-70 and Impossible project via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

HTML5モバイルアプリ開発講座Monaca入門編のレポートをお送りしています。

前回の記事はこちら。

はじめてのMonacaアプリでハイブリッドアプリ開発のスタートを切ろう
HTML5モバイルアプリ開発講座Monaca入門編のレポートをお送りしています。今回は、Monacaの登録とMonacaクラウドIDEおよびMonacaデバッガーのはじめての使い方についてお伝えしてきます。

ハイブリッドアプリを作成するためのMonacaクラウドIDEとMonacaデバッカーの使い方の最初の一歩についてお伝えしました。

簡単なカメラアプリを題材にして、最初のプロジェクトの作成からアプリの完成までを一通り体験しましたので、今回レポートをしていきますよ。

では、行ってみましょう!

新規プロジェクトの作成

では、早速進めていきましょう。

Monacaでアプリを作成する場合、プロジェクトという単位で作成をしていきます。

今回は、プロジェクトを作成するところから進めていきます。

まず、MonacaにログインしてMonacaのダッシュボードを開き、「新規プロジェクトの作成」をクリックします。

Monacaで新規プロジェクトの作成をする

フレームワークとテンプレートの選定

次に、使用するフレームワークとテンプレートを選定します。

すると、「新規プロジェクトの作成」ダイアログが開きますので、「No Framework」を選択し、「最小限のテンプレート」を「作成」します。

Monacaで「最小限のテンプレート」でプロジェクトを作成する

ちなみに、これを見る限り、JavaScriptの様々なフレームワークに対応していて、それぞれにいくつかのテンプレートが用意されていることがわかりますね。

プロジェクト名の入力

続いて、プロジェクト名を入力します。

「新規プロジェクト」ダイアログが開きますので、プロジェクト名を「カメラアプリ」として「プロジェクトを作成する」をクリックします。

Monacaでプロジェクト名を入力してプロジェクトを作成する

これで新規プロジェクト「カメラアプリ」が作成されます。

以下のようにプロジェクト一覧に追加されますので、「開く」で開くことができます。

Monacaで新規作成したプロジェクト「カメラアプリ」を開く

HTMLとJavaScriptの実装

プロジェクトを開くと、以下のような画面になります。

Monacaで新規プロジェクトを開いた画面

すでに、「index.html」が用意されていて、ある程度のHTMLが書き込まれている状態です。

これに、HTMLとJavaScriptのコードを追加していき、カメラアプリを作成していきます。

HTMLを差し替える

まず、bodyタグ内のHTMLコード差し替えます。

以下のHTMLです。

    
        

img要素とbutton要素ですね。なんとなく意味はわかりそうです。

JavaScriptを追加する

続いて、scriptタグ内に以下のJavaScriptを記述していきます。

入力が終わったら保存ですね。

実はこれで完成なんです。

Monacaデバッガーでカメラアプリの動作確認

では、Monacaデバッガーで動作確認をしていきましょう。

Monacaデバッガーを立ち上げ、プロジェクトから「カメラアプリ」を選択すると、ほぼ真っ白な画面に「写真を撮る」ボタンだけがある状態です。

「写真を撮る」ボタンをタップすると、カメラが起動します。

Monacaで新規プロジェクトを開いた画面 Monacaデバッガーのカメラアプリでカメラを起動

写真を撮影した後に、「写真を使用」をタップすると、以下のように撮影した写真画像がカメラアプリの画面に反映されます。

Monacaデバッカーのカメラアプリで撮った写真が反映される

このようなアプリを作成することができました。

思ったより簡単ですよね。

まとめ

以上、カメラアプリを題材にしてMonacaでプロジェクト作成からアプリの完成までの流れを一通り確認することができました。

あとはビルドの作業も残っていますが、簡単なアプリであれば、本当にすぐに完成まで持っていけそうな香りがプンプンします。

次回は今回使用したソースコードについて解説をしていきます。

どうぞお楽しみに!

連載目次:Monacaによるはじめてのハイブリッドアプリ開発

HTML5とJavaScriptのスキルだけでiOS/Androidにワンソースで対応できるハイブリッドアプリを開発できるプラットフォーム「Monaca」。その最初の一歩の知識と使い方について解説をしていきます。
  1. Monacaを使えばHTML5とJavaScriptでだけでスマホアプリを作れるぞ
  2. はじめてのMonacaアプリでハイブリッドアプリ開発のスタートを切ろう
  3. Monacaで最初っからアプリ完成までを簡単なカメラアプリで体験してみよう!
  4. Monacaで作成した超簡単カメラアプリのソースコードについて解説します
  5. Monacaで作成したアプリのビルド作業の一連の流れをつかもう
  6. モバイルアプリ向けUIフレームワークOnsen UIとは?またその特徴は?
  7. モバイルアプリのUIフレームワークOnsen UIでコンポーネントを設置するタグ

Monacaで作成した超簡単カメラアプリのソースコードについて解説します

$
0
0
camera

photo credit: Ennev Mess via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

HTML5モバイルアプリ開発講座Monaca入門編のレポートをお送りしています。

前回の記事はこちら。

Monacaで最初っからアプリ完成までを簡単なカメラアプリで体験してみよう!
HTML5モバイルアプリ開発講座Monaca入門のレポートをお送りしています。簡単なカメラアプリを題材にして、最初のプロジェクトの作成からアプリの完成までを一通り体験しましたので、レポートをしていきます。

簡単なカメラアプリの例を通して、Monacaによるハイブリッドアプリ開発の一連の流れを確認することができました。

ただ、まだソースコードの解説をしていませんでしたので、この記事でフォローできればと思います。

では、Monacaを使ったシンプルなカメラアプリのHTML及びJavaScript のソースコードについて解説をします。

では、行ってみましょう!

おさらい:カメラアプリの概要

まず、作成したカメラアプリの概要についておさらいをしておきたいと思います。

起動すると以下のような画面で、「写真を撮る」をタップすると、端末のカメラが起動し写真を撮ることができます。

Monacaで新規プロジェクトを開いた画面 Monacaデバッガーのカメラアプリでカメラを起動

撮影後、「写真を使用」をタップすると、以下のようにメイン画面に写真画像が挿入されます。

Monacaデバッカーのカメラアプリで撮った写真が反映される

このアプリについてHTMLとJavaScriptのコードについて解説をしていきます。

HTMLのコードの解説

index.html内のbodyタグに仕込んだHTMLのコードは、こちらでした。

    
        

まず、img要素ですね。画像が挿入されます。

id属性は”photo”とし、height属性つまり高さを400に設定しています。

src属性がありませんので、アプリを起動した時点では何も表示されません。

続くのは、button要素つまり「写真を撮る」ボタンですね。

id属性を”shoot-button”とし、クリックされたら、「shoot()」という関数が呼び出されるというものです。

JavaScriptのコードの解説

scriptタグ内のJavaScriptのコードはこちらでした。

function shoot(){
    var option = {
        saveToPhotoAlbum: true //撮影後端末に保存
    };
    
    //カメラを起動
    navigator.camera.getPicture(onSuccess, onError, option);
        
    //成功時に呼び出されるコールバック関数
    function onSuccess(imageURI){
        document.querySelector("#photo").src = imageURI;
    }
        
    //失敗時に呼び出されるコールバック関数
    function onError(message){
        alert("Error:" + message);
    }
}

端末のカメラを起動する

この関数shootで中心となっているのは、8行目の

navigator.camera.getPicture(onSuccess, onError, option);

の部分です。

これは、Cordovaのcamera APIを使用してカメラを起動している処理で、書式としては以下の通りです。

navigator.camera.getPicture(成功時処理, 失敗時処理, オプション)

端末のカメラを起動し撮影が成功したら「成功時処理」に指定した関数を、何らかの理由で正常に完了しなかったら「失敗時処理」に指定した関数を実行します。

オプションにはオブジェクトリテラルで、色々な設定をすることができるのですが、今回はsaveToPhotoAlbumというオプションをtrueにするというものです。

これは、名前の通り、写真の撮影後に、端末に画像を保存するようにするというものです。

撮影が成功したときの処理

撮影が成功した時の処理は、onSuccessという関数が指定されています。

内容は以下の通りです。

function onSuccess(imageURI){
    document.querySelector("#photo").src = imageURI;
}

カメラでの撮影後、撮影した画像ファイルを表すURIが成功時の関数に渡されます。ここではimageURIです。

documentオブジェクトは現在のHTML全体を表すオブジェクトです。

それに対してquerySelectorメソッドで、idがphotoである属性を掴んで、そのsrc属性を変更しているわけです。

それをid属性がphotoの要素はimg要素でしたね。つまりimg要素のソースを、撮影した画像をするということでした。

撮影が失敗したときの処理

撮影が失敗した時の処理は、onErrorという関数が指定されています。

function onError(message){
    alert("Error:" + message); 
}

カメラによる撮影が正常に終了しなかった場合、引数としてエラーメッセージを受け取ります。ここではmessageです。

ですから、そのエラーメッセージを「Error:」に続けてアラート表示するという内容ですね。

まとめ

以上、Monacaで作成したカメラアプリのHTMLおよびJvaScriptのソースコードについて解説をしました。

実際のアプリでは、ここまでシンプルということはないとは思いますが、どのように HTML とJavaScriptが動作しているのか、またCordovaのAPIを通して端末の機能にアクセスする仕組みについて体験することができました。

さて、実際にはこの後に、プラグインの有効化やビルドの作業が必要となります。

次回、その作業の流れについてお伝えできればと思います。

どうぞお楽しみに!

連載目次:Monacaによるはじめてのハイブリッドアプリ開発

HTML5とJavaScriptのスキルだけでiOS/Androidにワンソースで対応できるハイブリッドアプリを開発できるプラットフォーム「Monaca」。その最初の一歩の知識と使い方について解説をしていきます。
  1. Monacaを使えばHTML5とJavaScriptでだけでスマホアプリを作れるぞ
  2. はじめてのMonacaアプリでハイブリッドアプリ開発のスタートを切ろう
  3. Monacaで最初っからアプリ完成までを簡単なカメラアプリで体験してみよう!
  4. Monacaで作成した超簡単カメラアプリのソースコードについて解説します
  5. Monacaで作成したアプリのビルド作業の一連の流れをつかもう
  6. モバイルアプリ向けUIフレームワークOnsen UIとは?またその特徴は?
  7. モバイルアプリのUIフレームワークOnsen UIでコンポーネントを設置するタグ

ノンプログラマーはどのプログラミング言語を学ぶべきか #ノンプロ研

$
0
0
programing

photo credit: markus spiske Test Bild via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

さて、ノンプログラマーのプログラミング学習…どの言語を学ぶべきなのでしょうか?

「プログラム言語 おすすめ」などで検索すると、プログラム言語の紹介記事がたくさん出てきますよね。そして、なかなか悩みますよね。

その助けとなればいいなと、コミュニティ「ノンプログラマーのためのスキルアップ研究会」セミナーVol.3「『VBA vs GAS vs Python』どの言語を、どう学ぶべき?!」というセミナーを行いました。

プログラミングを学ぶには200~300時間かかりますが、プログラム言語について知るには90分程度で十分なのです。

私がこれまで携わってきた、VBA・GAS・Pythonの3つの言語について、歴史、特徴、動作環境、人気、求人、文法、言語仕様など、それはもうさまざまな切り口で比較してみましたので、一部レポートをしていきます。

※この記事はコミュニティ「ノンプログラマーのためのスキルアップ研究会」セミナーVol.3「『VBA vs GAS vs Python』どの言語を、どう学ぶべき?!」の内容の一部を加筆修正して記事にしたものです。セミナーからの抜粋動画もありますので、合わせてご参考くださいね。当日の様子は以下のツイートまとめもご覧くださいませ。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」第3回セミナー。ノンプログラマーのプログラミング学習…どの言語を学ぶべきなのか。そして、それぞれの言語の歴史、特徴、動作環境、人気、言語仕..

「何ができるか?」はライブラリを見ればわかる

まず、プログラミング言語について知るためには、「ライブラリ」を見るのがおすすめです。

ライブラリは、そのプログラム言語で「できること」を機能別や役割別にパッケージしたものです。

GASではライブラリではなく「サービス」と言ったり、Pythonでは「モジュール」とも言ったりします。

Excel VBAで利用できるライブラリ

例えば、Excel VBAでは以下5つのライブラリについて、デフォルトでチェックが入っている、つまり使用可能になっていて、それを使ってプログラムを書いています。

  • Visual Basic For Applications:VBA関数など
  • Microsoft Office 16.0 Object Library:Office
  • OLE Automation:OLE
  • Microsoft Excel 16.0 Object Library:Excel
  • Microsoft Forms 2.0 Object Library:フォーム

VBEの「ツール」メニューの「参照設定」で、ライブラリの確認や追加ができますよね。

ExcelVBAで参照可能なライブラリ

それで、他のライブラリにチェックを入れると、その機能も追加で利用することができるようになります。

Word文書を操作することができる「Microsoft Word 16.0 Object Library」など、他のOfficeアプリケーションを操作するライブラリや、FileSystemObjectやDictionaryを使用することができる「Microsoft Scripting Runtime」といった便利な機能を提供するライブラリなど、とてもたくさんのライブラリが用意されています。

したがって、一回ライブラリをザーッと眺めていただくと、VBAのできることが見えてくるということになります。

Google Apps Scriptができること

同様にGoogle Apps Script(GAS)ができることは、Google Apps Scriptの公式ドキュメントで「サービス」という形で確認することができます。

遷移した先の左側に「Services」ごとに紹介されていますが、以下表にまとめているように、たくさんのサービスが提供されています。

Services サービス数 説明
G Suite Services 12 G Suiteアプリケーションを中心に操作できるサービス群
Script Services 15 GAS全体で横断的に使える便利なサービス群
Advanced Google Services 19 サービスごとに有効化することで利用できる拡張サービス群

それはもうたくさんのGoogleアプリケーションの操作を行うことができます。

Pythonができること

Pythonはここまで登場した二つの言語とは少し違いまして、オープンソースで作られている言語です。

標準で搭載されているライブラリとしては、以下の公式ドキュメント(日本語に翻訳されています)で確認することができ、非常にたくさんのライブラリが提供されています。

さらに、 オープンソースということで世界中の凄腕の開発者たちが自由に外部ライブラリを作成することができます。

以下の「PyPI」というサイトでそのライブラリー郡を確認することができますが、なんと13万近くのライブラリが提供されています。

逆に、Pythonができることの全てを確認するのは至難の技ですが、とにかくいろいろなことができることはわかります。

3つの言語のできることまとめ

ざっと見てきましたが、3つの言語ともライブラリ(またはサービス)の拡張まで含めると、かなり色々なことができます。

その中でも、特徴をまとめると以下のようになりますね。

  • VBA:Officeを中心としたMicrosoft社製品とWindowsの操作(Macは少し苦手)
  • Google:Google社製品
  • Python:とにかく色々できる

もちろん、これ以外にも動作環境やキャリアへの影響など、知っておくべき視点は他にもあります。

では、どの言語を学ぶべきか

仕事で使える言語を選ぶべき

何をしたいかでおのずと選ぶ言語が決まってくるように思いますが、ノンプログラマー向けと考えると、実はもう一点考えてほしいポイントがあります。

それは、「仕事で使えるか」という点です。

人気の Web サービスをするためのプログラミング言語を学んでも良いのですが、一般的にノンプログラマーは、平日昼間はフルタイムで仕事があります。

従って、学ぶ時間の確保は基本的に週末となります。

しかし、ある程度プログラミングを習得して、なんらかのサービスを作るぐらいのスキルを身につけるためには、数百時間という規模の学習時間が必要になります。

週1,2のペースで学習をすると、ものにするために1年~2年といった期間が必要になってきてしまい、モチベーションの維持ができなくなる可能性が高いのです。

仕事に役立つ言語であれば、仕事中にプログラミングに触れる機会を作れることを期待できるわけです。

なので、「仕事に使える」言語を優先的に選んでみてください。

まずはひとつの言語をマスターしよう

もう一つ重要な考え方として、まずはひとつの言語をマスターすることが大事です。

というのも、一つの言語を学んだとすると、二つ目、三つ目の言語の学習コストはぐっと下がるという点があります。

データ型、変数、分岐、反復、関数、オブジェクト… この構成と学習の流れはだいたいどの言語でも一緒なのです。

もちろん、細かい部分での記述方法やルールは異なります。

ですが、だいたいの構成と流れが一緒なので、二つ目、三つ目の言語はその差分を学習して行けば良いということになるわけです。

そういう点でも、 仕事に使える言語を選択して一気に学ぶというのは、その後の展開を考えた上でも効率が良いのです。

コミュニティではノンプログラマーの学びを支援しています

以上、VBA・GAS・Pythonでどんなことができるのか、また学ぶ言語を選ぶポイントとして「仕事に使える」言語を選ぶべきということについてお伝えしました。

さて、そうして選んだプログラム言語ですが、ノンプログラマーの学びの道は、環境・周囲の協力体制・時間など様々な面で、課題が多いものです。

その学びを支援するためにコミュニティ「ノンプログラマーのスキルアップ研究会」を運営しています。

セミナーやオンラインでの情報提供やコミュニケーション、定期的な勉強会の開催といった機会を提供させていただいています。

以下ページにて、詳細の確認およびお申し込みが可能ですので、同じような仲間が集まる学び機会が欲しい!という方はご参加いただければうれしいです。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

「ノンプログラマーのためのスキルアップ研究会」セミナーレポート

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるためのセミナーを開催していますので、こちらで過去のレポートをお送りしています。
  1. プログラミングを習得するためには何時間の学びが必要なのか
  2. プログラミング学習のコツは「アウトプット」!人に教えるつもりで学ぶことのススメ
  3. ノンプログラマーはどのプログラミング言語を学ぶべきか
また、セミナーの動画は以下のショップにて完全版を販売していきますので、こちらもどうぞご活用くださいませ。 BASEショップ「ノンプログラマーのためのスキルアップ研究会」

【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法

$
0
0
cell-area

photo credit: andrey.pehota via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAで請求データ一覧から請求書を自動で作成するシリーズ、まだまだ続きます。

【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
エクセルVBAで文字列を連結する、文字列の書式を変更するなどの「文字列」に関するいくつかのテクニックを紹介しつつ、データ一覧から請求書を自動で作成するというシリーズ連載の序盤の完成を目指します。

前回の記事までで、請求データ一覧から請求書ひな形にデータをコピーするという処理は、完成しました。

ただ実は、セルの範囲をコピーするだけならFor~Next文を使わずに、もっと簡単で実行時間を短くできる記述の仕方があります。

今回は、エクセルVBAでセル範囲を一気にまとめてコピーする方法についてお伝えします。

なお、この記事は以下のYouTube動画と連動していますので、合わせてご覧いただければと思います。

では、行ってみましょう!

前回のおさらいと実行時間という課題

前回までで、請求データ(wsData)というシートから、請求書ひな形(wsTemplate)の該当のセル範囲に、請求データを転記するというプログラムを作りました。

請求データのイメージはこちら。

エクセルVBA用請求データ一覧の品目を増やした

請求書ひな形のイメージをこちらです。

請求書ひな形を長く

それで、作成したソースコードは以下の通りです。

Sub 請求書作成()

wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示

Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得

Dim i As Long, j As Long, k As Long
k = 21
For i = 2 To rowsData
    For j = 1 To 3
        wsTemplate.Cells(k, j).Value = wsData.Cells(i, j).Value
    Next j
    k = k + 1
Next i

wsTemplate.Rows(21 + rowsData - 1 & ":50").Hidden = True 'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"

End Sub

実行時間は転記の回数に依存する

さて、コードの8行目から15行目なのですが、入れ子になっているFor~Next文でデータの転記を行っています。

前回の例を見る限り、行数は6、列数は3ですから、合わせて計18回の転記が行われてるということになります。

ただ、実行時間の視点で考えてみると、セルの転記の処理時間は、セルの数ではなく転記の回数に依存するという事実があります。

なので、この18回という転記の回数を減らすことができると、実行時間という点では望ましいわけです。

Copyメソッドでセル範囲をコピーする

そこで、覚えていただきたいメソッドがCopyメソッドです。

Copyメソッドは、セル範囲をコピーするメソッドで、以下のように記述します。

Rangeオブジェクト.Copy コピー先のセル範囲

これで、対象となるRangeオブジェクト、つまりセル範囲をコピー先のセル範囲にコピーをすることができます。

コピー先のセル範囲は、単一セルを指定すれば、そのセルを左上にしたセル範囲への貼り付けとなります。

請求データをまとめて転記する

今回の場合、コピー元のセル範囲のアドレスは請求データの「A2:C7」、コピー先のセル範囲の左上のセルのアドレスは「A21」になりますから、以下のようなコードを使えば良いわけです。

wsData.Range("A2:C7").Copy wsTemplate.Range("A21")

8行あったコードがたったの1行です…!

実際にこれで実行してみると、以下のように転記されます。

エクセルVBAで転記元の書式もコピーされてしまった

無事に値としては正しい値がコピーされますが、書式までコピーされてしまい、想定のフォントではなくなってしまいました。

Copyメソッドはすべて貼り付け

これは、Copyメソッドを使った場合の貼り付け形式が「すべて貼り付け」であるということによります。

つまり、値だけではなく書式も含めた全てがコピーされてしまうのです。

この問題の、最も単純な解決法の一つとしては、元のデータのフォント種類とサイズを貼り付け先のそれと揃えるという方法があります。

以下のように、「Meiryo UI」の「12ポイント」に変更してみました。

エクセルでコピー元のフォントを変更した

これで先程のプログラムを実行すると、以下のように想定したフォント種類とそのサイズで貼り付けをすることができます。

エクセルVBAでセル範囲をまとめてコピーした

まとめ

以上、エクセルVBAでCopyメソッドを使ってセル範囲をまとめて一気にコピー&ペーストする方法についてお伝えしました。

ソースコードはこちらです。

Sub 請求書作成()

wsTemplate.Rows("21:50").Hidden = False '隠れているかもしれない行を再表示

Dim rowsData As Long '行数カウント用の変数
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '最後の行数を取得

wsData.Range("A2:C7").Copy wsTemplate.Range("A21")

wsTemplate.Rows(21 + rowsData - 1 & ":50").Hidden = True 'データがない行を隠す
wsTemplate.Range("A18").Value = "ご請求金額:" & Format(wsTemplate.Range("D54").Value, "#,##0") & " 円"

End Sub

今回の例ほどのデータ量であれば大した差は出ませんが、データの量が多くなるとその実行時間の差は如実に出てきます。

セル範囲はまとめてペーストできるときは、まとめてするというのが定石です。

さて、次回はセル範囲に変化があったとしても、上手にほしい範囲を取得する方法がありますので、それについてお伝えしたいと思います。

【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
エクセルVBAで請求データ一覧から請求書を作る初心者向けのシリーズです。今回は、エクセルVBAでワークシートのデータのある範囲だけを取得するUsedRangeプロパティの使いかtあについてお伝えします。

どうぞお楽しみに!

連載目次:データ一覧から請求書を自動で作る

お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。
  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
  3. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  4. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  5. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  6. 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
  7. 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
  8. 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
  9. 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
  10. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
Viewing all 2099 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>