ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュの【3行でも?】マクロを作ろう!【本格的に?】

  • mixiチェック
  • このエントリーをはてなブックマークに追加
作ったマクロを発表したり、こうしたらいいよ!と、語り合いましょう。

色々な方法がありますよね。

・下手でも、けなさない。励ましの言葉は歓迎。上から目線も不要。
・単なる質問は禁止。全部でなくてもいいから、動かなくてもいいからコードを書いてね!
 (レスは、コードを書かなくとも可)

マナーを守ってね。後出しの一方的な否定的な言葉はいらんよ。

コメント(152)

ゴリッゴリにプログラム組みまくって、ようやく初級の数独が解けるようになりました。
単純な行、列、ブロック単位の数値の確定と、
行・列限定の法則を使った程度です。

ロジックをどんどん追加していく事を想定し、細かくモジュールを分けたり構造体を
作ったりしている為、初級程度の実力しかないのに500ステップ以上あります(苦笑)

ただ、ベースをきっちり作りこんだので、これから先のロジックも組み込みやすいと思います。

ちなみにこれってどこにアップしたらいいのでしょう(汗)
>>[113]

> ちなみにこれってどこにアップしたらいいのでしょう(汗)

Google ドライブ は便利ですよ。
https://drive.google.com/start
>>[114]

Google は仕事用に複数使いすぎてるので、切り離したいのです。。。

フリーHP スペースにupしてみました。
帰ったらURL 張ってみます。
excelファイルをアップしたくなかったので、とりあえず
マクロだけアップしました。

標準モジュールのところに貼り付けてもらえれば動くはずです。
自己責任でおねがいしまっす!

http://shinagawan.web.fc2.com/sudoku/sudoku_upl.txt

ボタンに Macro1() を関連付けてもらえれば問題ないです。

「解答」と「初期値」というシートをつくってください。

解等はD4のセルから。
問題はC3のセルから。

枠は自分で書いてください(マテ


↓画面キャプチャ↓
※直リンしないみたいなのでURLを貼り付けてください。

http://shinagawan.web.fc2.com/sudoku/img01.jpg

http://shinagawan.web.fc2.com/sudoku/img02.jpg

http://shinagawan.web.fc2.com/sudoku/img03.jpg

単純な縦横&ブロックの数値かぶりのチェックと、
行限定とか列限定とかいうテクニックだけ取り込んでいます。

なので、初級の初級しかクリアできません(汗)

5時間程度で一発書きしたものなので、色々おかしいかも
しれません。

ちなみに、Excel特有の関数などは使っていません。

ロジックはほぼ自力です。

Excelの便利な関数とかを知らないという事もあるのですが、
今後、複雑なロジックを取り入れようとした場合、地味な
自力のロジックをまとめた関数や構造を持っておかないと
対応できなくなるかな。。。と思いまして。

一応、攻略サイトを見て全ての必殺技を実現できるような
ベースは出来たと思います。

後はその必殺技を私が習得できるかどうk(ry

縦横のロジックは入れ替えるだけで共通化してもいいかな
と思ったのですが、今でもごっちゃごちゃなので、これ以上
複雑にしたくないと思い、縦方向のロジックと横方向のロジックは
コピーして書き換えただけになっています。
まぁ言い訳ですが。

これ以上すっきりさせるつもりは今のところないので、
このまま次の攻略法を順次取り入れていきたいと思います。

・・・が、気が向いたら・・・ということで(汗

これを使ってどなたかが解法を増やしてくれても嬉しいですw
>>[116]
マクロのコードは見れますが、画像が見れません!
アクセスする権限がありませんって、エラーが表示されます!
>>[117]
URLをクリックしてませんか?
直リンできないみたいなので、説明にも書いてあるように、
URLをはりつけてみてくださいー
そういうことですか。失礼しました。
ちゃんと見ることができました。
しかしなんでこんな仕様なんだろう・・・
>>[116]

早いですね〜!!見てみたい誘惑を抑えて、(でも、画面は見てしまったけど)私の方も。

112でアップしたのからあまり進んでいません。1の数字から、3x3のマスを見て、縦に見て、横に見て、入らないトコを黄色にして、次に3x3のマスに注目して、1の数字が入るところが1つだったら確定させます。次に2を調べる・・と。
数独を解くロジックが全然足りなくて、あまり埋まりませんね。多分、難しいのだと1個も埋まらないかも。

https://www.youtube.com/watch?v=AX7cMumfTzo

これで上手くリンク出来るのかな・・。デン!と、大きく出すほどのものじゃないですし。

皆様のを見ると、意気消沈しそうです!多分。
連投失礼します。

上の動画のキャプチャーは、ユーザーフォームを使ったためか、何故かあまり上手く撮れてないです。見苦しくて恥ずかしい限りです。
上の説明通りなんですが、1が終わって、2が終わって、3に入ったところでキャプチャーを止めています・・。
ちょっと解析メッセージ、集計を入れて動画にうpしました。

>>[122]
 UPされた動画を見ました!すごいですね〜!16秒ぐらいで解けてしまうのですね。しかも”待ち”を入れいるのでしょうか・・。(コードを見ればわかるのでしょうけれども、敢えて見ていませんので。)

私の方は、120(=112)のヤツは、基本ルール(※)だけで何回も回すと解けてしまいました。次の問題は手詰まりになり、解けませんでした・・。さて、どんな数独のロジックを入れこむかなあ・・と、言ったところです。

※基本ルール
 ブロック・縦・横には、同じ数字は1つだけ。


>>[123]
待ち(ウェイト)は入れてません。
ただ、シート上で解いている様子を表現しているので、これがウェイト代わりに
なってしまっています。
通常のアプリでもログ出力など、画面処理を入れてしまうと処理速度はがた落ちに
なります。

余談になりますが、Excelの画面処理は異常なほど重いので、内部で計算した場合と比べると
天と地ほどの差になります。
その為、マクロ自動処理を組む場合、スピードが重視されるのであれば画面出力を
極力押さえ、最終結果だけ画面に出力するように気をつけなければなりません。
(とはいえ、セルの値を利用する場合、シートを切り替えたり選択しないと処理が出来ない
 事もあるので、経験やバランス、試行錯誤が必要になると思います)

アップしたマクロについても、経過画面出力なしバージョンを作ってみようと思います。
出力ありなし切り替えをフラグで行うので、その分オーバーヘッドになりますが、
それでも画面出力と比べたら誤差みたいなものなので。
10分しか経ってないですが報告だけでも。。。
画面出力を一通りストップしてみたら予想通り劇的に早くなったので、
作業から漏れていた(まだ画面に出力されてしまっている)部分も全て完璧に
出力を止めたものを動画に撮ろうと思ったのですが。。。

撮影はしないことにしました。。。

スタートを押した瞬間に処理が完了してしまいました(汗)
0.1秒とかそんな動画をアップするわけにもいかないので、とりあえず文章での報告となります。。。

複雑なロジックを組み込んだら、もう少し処理が重たくなるかもしれません。
Excel DE 数独。止まっています。次にどんな解法を入れたらいいのかなあ・・と。でも、何個の解法を入れたところで、解けるのは限られるような気がします。

Excelをいじくる趣味はあっても、数独の方は、興味がない。割り切り過ぎなんでしょうねえ。

これが仕事だったら、業務を知らなかったら、Excelマクロなんて作れる訳ないじゃん!!と、お叱りを受けることと思います。

総当りみたいのをロジックに入れてみるかなあ・・。果たして、出来るのでしょうか!?
>>[126]

人間的な解答求めるなら、縦横埋まってるマスと近隣埋まってるマスで埋めてからです。

解を求めるにはそこから2、3の解があるマスが縦、横、近隣にあるか、あったら確定にして次の処理にいくか。

プログラムのばあい、全部をプログラムで処理するか、理論的に処理するかをコーティングするかで趣味の世界なんでしょうね。
2、3は確定するマスがあればそれ以外は入らない、ソ言う意味です、
>>[127]
 はい!いつもありがとう。(と、言っても残念ながら、言っていることが、あまり良くわからないのですけれども。ごめんなさい。)

 で、のぐち@チャリマニさんなら、コードとか、Excelの具体的なロジックを披露しちゃって下さいね。ここはQ&Aのトピじゃなくて、マクロを作ろう!を趣旨としていますので、そこんとこ、宜しくお願いしますね。
間が開いてしまっています。気がついたら、1ヶ月以上も。

自分では、ボチボチとはやっていますが、こちらに書き込むほどの進展はありませんOrz この休みにも、コードを書きたいとは思っています。

で、実は次のお題も(私自身では)決まってまして、カレンダーを作ろう!なんです。まあ、よくあるお題なんですけど。構想では、(当然ながら)年内には、ある程度は・・と思ってました。まあ、わざわざマクロを書かなくとも、ネットを探せばあると思うのですが、ここは、マクロの練習・習熟と言うことで。どたなたかスタートされても結構ですよ!

ただ、私自身もmixiは離れつつあるので、果たして・・とは思ってます。
(何か、マクロの話題でも・・と、来られた方、内容がなくてごめんなさい。)
「M:マクロ→R:新しいマクロの記録」にて、何かのマクロを実行させる操作
をすると、これは記録される。例↓
Application.Run "PERSONAL.XLS!<マクロ名>"

しかし、「M:マクロ→S:セキュリティ」にて、security levelを変更す
る(例:中→高)操作をすると、これは記録されない。
>>[131]
セキュリティレベル変更は確かに記録は出来ないですね
どうしてもマクロにやらせるのであればレジストリを
書き換えさせるとかですかね
>>[132]
statement "SaveSetting appname, section, key, setting"で
registryの"HKEY_CURRENT_USER\Software\VB and VBA Program Settings"
以下を書き換えることはできますが、マクロでregistryの他の部分を書き
換えることはできるかどうかは、分かりません。

http://www.microsoft.com/japan/office/ork/2003/seven/ch25/SecC02.htm

security levelについては、property Application.AutomationSecurity
により、変更できるみたいです。
>>[133]
>マクロでregistryの他の部分を書き
>換えることはできるかどうかは、分かりません。
WshShellオブジェクトを使えば書き換えられたと思います

>security levelについては、property Application.AutomationSecurity
>により、変更できるみたいです。
そんな方法があったんですね
現在、IMEはGoogle日本語入力を利用している。
http://www.excel-excel.com/tips/vba_92.html
上記Web pageを参考に、MacroでのDDL procedure呼び出しによりIME(日本語入力)
をONにする処理の主要部分を以下の通り。
  hwnd = FindWindow("XLMAIN", Application.Caption)
  Himc = ImmGetContext(hwnd)
  iRtn = ImmSetOpenStatus(Himc, 1&)
  ImmReleaseContext hwnd, Himc

http://www.excel.studio-kazu.jp/kw/20030610223504.html
ここに記載される、関数ImmSetConversionStatus() を呼び出す方法では、
IMEをONにすることができなかった。
IMEをMicrosoft IMEに切り替えてもできなかった。
動的配列の再定義記述文 ReDim [Preserve] 配列名(添数末尾値)
添数開始値を0(Option Base 0)とした場合、
「配列要素数=添数末尾値+1」となる。

この再定義記述文で指定する小括弧内の数値は添数末尾値であって、
配列要素数でない。
参考書やWeb pageの説明を見ても、"Option Base 1"としている場合が多く
て、わかりにくかった。

以下、配列要素数10個の動的配列に要素数を1つづつ増やしながら、其々に
数値を代入していくマクロ。

Option Base 0
Sub sample01()
  Dim iC As Integer
  Dim arrA() As Integer

  ReDim arrA(0) '動的配列定義初期値(要素数0)の状態で関数UBound()
  arrA(0) = 0  'を使うとエラーとなるので、For 文の前に設定する
  For iC = 1 To 9
    ReDim Preserve arrA(UBound(arrA) + 1)
    arrA(UBound(arrA)) = iC
  Next iC
End Sub
active worksheetのセルを順にアクセスして何かを行う処理。
例えば、以下の文字列"AAAA"を検索するマクロ。
値が"AAAA"であるセルが無い場合、プログラムが固まってしまう。

Sub sample01()
  Dim rgA As Range
  For Each rgA In ActiveSheet.Cells '正 ActiveSheet.UsedRange
    If rgA.value="AAAA" Then
      MsgBox "It is found."
      Exit Sub
    End If
  Next rgA
  MsgBox "It isn't found."
End Sub

worksheetのデータのある範囲だけ検索すれば良いから、
ActiveSheet.Cells をActiveSheet.UsedRangeにする。
データのある範囲は、immediate windowで以下のようすれば見ることができる。
? activesheet.usedrange.rows.count
11
? activesheet.usedrange.columns.count
30
ホームページ風ブログでVBAのIE自動操作や基礎を解説しているサイトを作ってますのでよかったら見に来てください。
最近空き時間に作り始めたばかりなので記事数は少ないですが、随時更新するのでたまに見に来て頂けたらと思います。
また、SNSなどでの拡散もよかったらしてください。
Blogger→http://blackvanilla-vba.blogspot.jp/p/contents.html
livedoor→http://blog.livedoor.jp/blackvanilla39/
>>[150]
斜め読み、且つ検証していませんが何点か気になることがあります。

・セルの範囲選択と可変式選択
1. 【End(xl○○)】の部分で「○○にはDownやUp、RightやLeftが入ります。」
とありますが「Right」「Left」は入りません。入るのは「ToRight」「ToLeft」のはずです。

2. 「Range("A1").End(xlDown).Row.Select」
これは合っていますか?エラーになるように思うのですが。

・IE操作
getElementsByTagNameで全てのINPUT要素を見ているようですが
getElementByIdメソッドやgetElementsByNameメソッド等をうまく組み込んだほうが
効率的だと個人的には思うのですが、いかがでしょうか?
>>[151]
コメントありがとうございます。
1と2については、記事をしっかり確認してないままの公開になっていたため、訂正しました。

IE操作についてですが、初心者向けのサイトという形で作ってますので、次の3点の事からinput要素を見るようにしています。

1点目、最初に自動操作の流れを覚える為
→getElementByIdメソッドを使うとIfを使わなくてよくなるため、タグから要素を取得した際、次の処理がわからなくては意味がないと思ったため

2点目、複数のやり方を一度に書くと混乱を招く為
→例えばElementsとElementの様に微妙な違いがあるので、同じ記事だと初めて触れる人からすると混乱すると思いました。

3点目、HTMLについてもタグやID、Nameなどもわからない人がいると思いますので、まずはHTMLの形式を見てみる為
→HTMLに慣れていればいいですが、全くの無知な方もいますので、そういう方には外から内に向けての説明の方が、一度に覚えることが少なく、1歩ずつ進めると思いますので

上記の理由の為、タグからの操作をベースに説明しています。
その為、これからの更新の中で派生させていくようにする予定なのですが、まだ記事が追いついてませんのでその点はこれからという事になります。

ログインすると、残り124件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。