ラベル vba の投稿を表示しています。 すべての投稿を表示
ラベル vba の投稿を表示しています。 すべての投稿を表示


Th 02 VBA AppleScript

【Mac】ExcelVBAでダウンロードフォルダの中のファイルから一番新しいファイルのパスを取得する方法。に引き続き誰の役に立つのかわからないシリーズ。

自分用メモとして記載しておきます。

AppleScript

tell application "Finder"
    set myfiles to a reference to (sort (get files of (path to downloads folder)) by creation date)
    set myfile to end of myfiles
    set ext to name extension of myfile
    set newNameNoExt to "変更後ファイル名_拡張子なし" as Unicode text
    set newName to newNameNoExt & "." & ext as Unicode text
    set newPathFileNAme to (path to downloads folder) & newName as Unicode text
    set cnt to 1
    repeat with tmpFile in myfiles
        if newPathFileNAme = (tmpFile as Unicode text) then
            set newName to newNameNoExt & " _" & cnt & "." & ext as Unicode text
            set newPathFileNAme to (path to downloads folder) & newName as Unicode text
            set cnt to cnt + 1
        end if
    end repeat
    set name of myfile to newName
    return newPathFileNAme
end tell
もうちょっとキレイなコードで書ける気がするのですが、今の僕にはこれで精一杯。

説明付き

説明付きで記載します。実際には説明部分は不要なので、上記のコードをコピーしてください。

-- Finderで処理します。
tell application "Finder"
    -- これでダウンロードフォルダの中のファイルを取得して更新日付の古いやつを頭にしてmyfilesにいれます。
    set myfiles to a reference to (sort (get files of (path to downloads folder)) by creation date)
    -- myfilesの中から一番最後(一番新しい)ファイルを抜き出します。
    set myfile to end of myfiles
    -- myfileの拡張子を抜き出します。
    set ext to name extension of myfile
    -- 変更後のファイル名を拡張子なしで指定します。
    set newNameNoExt to "変更後ファイル名_拡張子なし" as Unicode text
    -- 変更後のファイル名を拡張子つきで指定します。
    set newName to newNameNoExt & "." & ext as Unicode text
    -- ファイルパス付きで新しいファイルを指定します。
    set newPathFileNAme to (path to downloads folder) & newName as Unicode text
    -- すでに新しいファイル名と同じファイルがあった時ようにカウントアップします。
    set cnt to 1
    -- ダウンロードフォルダになるファイル全て処理します。
    repeat with tmpFile in myfiles
        -- 新しいファイル名と同一のファイル名がある場合には、ファイル名の最後にカウントをつけます。
        if newPathFileNAme = (tmpFile as Unicode text) then
            -- カウントをつけたファイル名を定義します。
            set newName to newNameNoExt & " _" & cnt & "." & ext as Unicode text
            -- カウントをつけたファイルのパスつきで定義します。
            set newPathFileNAme to (path to downloads folder) & newName as Unicode text
            set cnt to cnt + 1
        end if
    end repeat
    -- ファイル名を書き換えます。
    set name of myfile to newName
    -- 新しいファイル名をパスつきで返します。
    return newPathFileNAme
end tell


VBA用

VBAからMacScript呼び出すときには、ダブルコーテーションの付け方が面倒なので、念のため。
新しいファイル名には、処理中で指定する、FnameとMyDateで指定していますが、ご自身のコードにあわせて変えてください。


' ダウンロードしたファイルのパスを取得する。

' ファイル名も同時に変更してしまう。

s = "tell application ""Finder""" & vbCrLf & _

    "set myfiles to a reference to (sort (get files of (path to downloads folder)) by creation date)" & vbCrLf & _

    "set myfile to end of myfiles" & vbCrLf & _

    "set ext to name extension of myfile" & vbCrLf & _

    "set newNameNoExt to """ & Fname & "_" & MyDate & """ as Unicode text" & vbCrLf & _

    "set newName to newNameNoExt & " & """.""" & " & ext as Unicode text" & vbCrLf & _

    "set newPathFileNAme to (path to downloads folder) & newName as Unicode text" & vbCrLf & _

    "set cnt to 1" & vbCrLf & _

    "repeat with tmpFile in myfiles" & vbCrLf & _

        "if newPathFileNAme = (tmpFile as Unicode text) then" & vbCrLf & _

            "set newName to newNameNoExt &" & """ _""" & " & cnt & " & """.""" & " & ext as Unicode text" & vbCrLf & _

            "set newPathFileNAme to (path to downloads folder) & newName as Unicode text" & vbCrLf & _

            "set cnt to cnt + 1" & vbCrLf & _

        "end if" & vbCrLf & _

    "end repeat" & vbCrLf & _

    "set name of myfile to newName" & vbCrLf & _

    "return newPathFileNAme" & vbCrLf & _

"end tell"

    

'Debug.Print s



str = MacScript(s)


最後に

わかってしまえば、まぁそれでいけるよな、と思うのですが、なかなかAppleScriptのお作法になれることが出来ずに簡単なことができないです。

たぶん、もう少し簡単なコードで同じこと実現できる気がするのですが。。。

以上です。

【Mac】AppleScriptおよびExcelVBAでダウンロードフォルダの一番新しいファイル名を変更する方法



ExcelVBADictionary

ちょっと釣り気味なタイトルですが。。。
実はずっとMacのExcelVBAでDictionaryオブジェクトが使えなくて困っていました。

Dictionaryオブジェクトというのは、WindowsのVBAで用意されているオブジェクトで、ユニークなキーと内容をセットで保存できるオブジェクトで別名辞書オブジェクトなんて言われることもあります。
これを使うと、ある列の値をユニークにしたり、ちょっととっておいてあとでキーをくるくる回して中身を拝借なんてことが簡単にできてしまいます。
難しい言葉で言うと連想配列 - Wikipediaなんて言うそうです。

使いかた

結論だけ先に書いてしまうと、以下の素晴らしい記事の中にあるコードをコピーして、クラスモジュールにペトリと貼り付けるだけです。

Office 2011 for Mac Dictionary replacement
やってみると、うぉ!と声が出るほど素晴らしいです。

と言ってもなんのことだかわからない方もいるかと思いますので、もう少し詳しく。

サイトにアクセスして、該当のコードをコピーします。

Th Dictionary1


Excelを立ち上げて、エディターを立ち上げます。
挿入から、クラスモジュールを挿入します。

Th Dictionary2


クラスモジュールが挿入されたら、コピーしたコードを全て貼り付けます。

Th Dictionary3


これで、Dictionaryオブジェクトのクラスができました。
次に、挿入から標準モジュールを追加します。

Th Dictionary4

標準モジュールから、先ほど作成したDictionaryオブジェクトを呼び出してみます。
こんな感じのコードを書いてテストしてみます。

Rem Dictionaryオブジェクトが動くかテスト
Sub test()
'Dictionaryオブジェクトは必ず挿入したクラスの名前で定義する。
Dim MyDicObj As Class1

'キーと内容の変数を宣言
Dim myKey As Integer
Dim myValue As String

'新しいDictionaryを作る
Set MyDicObj = New Class1

'キーを1から10までループ
For myKey = 1 To 10
     '内容を作る
     myValue = myKey & "内容"
     'Dictionaryにキーと内容を追加
     MyDicObj.add myKey, myValue
Next myKey

'キーを指定して内容を抽出
MsgBox "5のキーに入っている内容は" & vbNewLine & MyDicObj.items(5) & vbNewLine & "です。"

Set MyDicObj = Nothing
End Sub


ここでのポイントは2点です。
クラスモジュールを使う場合、必ず変数として、作成したクラスの名前で定義します。
また、使う時には、Newで新しくクラスを作成します。
これはクラスを使うときのお決まりみたいなものなので、覚えてしまいましょう。

Th Dictionary5

クラスの名前とは、エクスプローラーに表記されている名前です。

Th Dictionary6

クラスが正しく定義されていれば、エディターで書いているときに、.を打つと、プロパティが表示されます。

Th 01 dictionary

Dictionaryにキーと内容を追加するには、addを使います。

Th 02 dictionary

できたら、コードを実行してみます。

Th 03 dictionary

キーと内容がセットになって登録されていることがわかります。

Th 04 dictionary

サンプルのダウンロード

サンプルのダウンロードは以下から可能です。

サンプルダウンロード

最後に

データ容量が大量になったときも問題なく動くのかまだテストしていないので、なんともですが、ある程度のデータ量ならそれなりに動いてくれそうです。
Macでどうやって実現しよう!?とかなり困っていたので、とてもとても助かります。

以上です。

【Mac】MacのExcelVBAでもDictionaryオブジェクトが使えた!というか自作(コピペ)できた!


photo credit: COG LOG LAB. via photopin cc

誰の役に立つのかわからないのですが、自分用のメモとして。

前提

あるURLをGETで叩くと、ファイルがダウンロードされるとします。

そのダウンロードしたファイルはウェブ側でランダムなファイル名がつけられるとします。

この場合ダウンロードしたファイルを自分で指定するのではなく、VBAの中からダウンロードフォルダを参照して一番新しいファイルのパスを取得して、処理対象ファイルを特定してしまいたいと思います。


MacのExcelVBAでファイル操作するならAppleScriptが一番簡単

WindowsのExcelVBAばかりを触ってきた僕のような人には、入り口はとっつきづらいですが、慣れてしまえばファイル操作関係はAppleScriptに任せてしまうのが一番簡単です。

AppleScriptでダウンロードフォルダの中のファイルを引っ張って、一番新しいファイルのパスを取得するには以下のように書きます。

tell application "Finder"
set myfiles to (sort (get files of (path to downloads folder)) by creation date)
set myfile to end of myfiles as alias
return myfile
end tell


試しに、MacのAppleScriptエディタから上記をコピーして貼り付けて実行して見てください。

ご自身のダウンロードフォルダの中のファイルで一番新しいファイルのパスが返されるかと思います。

あとは、これをExcelVBAから呼びだしてあげます。

ExcelVBAからの呼び出しは、MacScriptで。

お決まりですが、ExcelVBAからAppleScriptを実行するには、MacScriptで行います。

s= "tell application ""Finder""" & vbCrLf & _
"set myfiles to (sort (get files of (path to downloads folder)) by creation date)" & vbCrLf & _
"set myfile to end of myfiles as alias" & vbCrLf & _
"return myfile" & vbCrLf & _
"end tell"

myfile = MacScript s

実はこれ、iPhoneから更新しているので本当にこのままで動くのかやや不安なのですが。

たぶん、ダブルコーテーションの書き方とスペースの取り方を間違えてなければ動くはずです。

これで、Myfileにダウンロードフォルダの一番新しいファイルのパスが返ってきます。


最後に

AppleScriptを使うと、えっ!これもMacのExcelVBAだと出来ないの!?と思っていた事が大抵できるようになります。

AppleScriptエディタも意外と使ってみると簡単に使えますので、なんか難しそうと思って敬遠していた方は是非使ってみてください。

プログラマーでなくても意外とできます。

以上です。




【Mac】ExcelVBAでダウンロードフォルダの中のファイルから一番新しいファイルのパスを取得する方法。


Th Excel2

MacでExcelVBAを使う際にもっとも基本的なことなのに難しいことのひとつに日本語のファイルのパス指定があります。

Macでも、Applescriptを使うと、日本語のパスでも取得可能でしたので、忘備録のため記載します。


【Mac】ExcelVBAで日本語ファイルのパスを指定する方法

XCEL

はじめに

先日、仕事でエクセルを使う必要があって、仕方なく、『Office for Mac 2011』を買ったのですが、ひどいですね。これ。

ExcelのVBAで日本語が扱えない。

これは、日本のユーザーにとっては致命傷でしょう。

例えば、ExcelのVBAからファイルを指定する場合、こんな感じにすればできます。
(Mac限定です)

Sub test()
    Dim spath As String

    spath = MacScript("Choose File")
    Debug.Print spath
End Sub
このデバックプリントの結果
alias Macintosh HD:Users:(ユーザー名):Dropbox:カメラアッフ_ロート_:20130512170210.png
こんな感じになっちゃう。

カメラアッフ_ロート_って。

自分のMacだけなら、日本語使わないなどで回避できますが、会社となるといろんなスキルの人がいるので、日本語禁止というわけにもいかず。

回避するために、AppleScriptを試し中ですが、本末転倒な感じが。

最後に

これはWindowでもMacでも使えるVBAを書くのはかなり大変そうです。

以上です。

【Mac】Office for Mac 2011のエクセルVBAで日本語が扱えない問題

Tintin44 - Sylvain Masson / Foter / CC BY-NC-ND


すごく下らないことなんだけど、ブログにHTMLやVBAのコードってどうやって表示するの?
と疑問に思ってしまい、調べてみました。

hemtl


こういうのです。

BloggerにソースコードをハイライトするSyntaxHighlighterを導入する | DevAchieve によれば、SyntaxHighlighterというものを導入すれば、比較的カンタンにできるらしい。

Syntax Highlighter Scripts Generator ‹ Blogger Widgets | Tips | Tricks | Templates : Way2Blogging というところにアクセスして、ジェネレータで、まずはコードを取得します。

僕は、vbaとhtmlとcssとjavascriptを使うのでチェック。
たぶん、ちょっと戸惑うのは、文字の右側にチェックするところくらいと、いきない広告でfree Trialとあるので、有料?と思ってしまうところくらいでしょうか。

SyntaxHighlighterの設定

取得したコードを、Bloggerに貼り付けます。

SyntaxHighlighterの設定2

テンプレートからHTMLの編集をクリック。

SyntaxHighlighterの設定3
/headの下に貼り付けます。


これで基本設定はおしまい。
BloggerにソースコードをハイライトするSyntaxHighlighterを導入する | DevAchieve では、さらに見やすくするためのCSSの調整も書いてありますが、本日は時間ないので、とりあえずこのままで。

で、投稿するときには、以下のように書きます。
  

 htmlの場合:html
  VBAの場合:vb



以上です。

【Blogger】ブログにHTMLやVBAのコードってどうやって表示するの?

メモ的にエントリー。

LibreOfficeでセルに数字入力するbasic(エクセルでいうところのVBA)どうやって書くんだ?が意外と調べるの大変だったので、簡単にメモ
basicのコードをかける画面を立ち上げます。

スクリーンショット 2012 12 27 10 49 48

以下のようにコードを書きます。

スクリーンショット 2012 12 27 10 54
 
 
rem セルA1に「1」を入力する
Sub Main

Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
oCell = oSheet.getCellByPosition(0, 0)
ocell.string = 1

End Sub


解説
Dim oDoc As Object
oDocという変数をオブジェクトとして宣言します。
ドキュメント(文章・表計算など)を操作するために使います。

同様にシートや、セルについてもオブジェクト変数を宣言します。
Dim oSheet As Object
Dim oCell As Object
oDoc = ThisComponent
これで現在扱っているドキュメントがoDocに格納されます。
例では、表計算。
oSheet = oDoc.Sheets(0)
これで、sheet1がoSheetに格納されます。
oCell = oSheet.getCellByPosition(0, 0)
これで、セルA1がoCellに格納されます。

注意:エクセルのVBAに慣れている方は、番号の振り方が、1からではなく0からになっていることに注意してください。
ocell.string = 1
これで、セルA1に「1」という数字が挿入されます。

以上。メモ的エントリーでした。

【mac】LibreOfficeでセルに数字を入力する方法