« Linux Mint 19にWine 4.0をインストールしてみた。ゲームが動かないよ?! | トップページ | Linux Mint 19でMinitubeが動作しない(Error transferringとなる)。 »

2019年2月 2日 (土)

それ、マクロにすりゃいいのに! -Excelマクロ VBAのお話し。-

201902023

 

 

最近、Linux mintのwine 4.0で格闘しておりますが。。。
進展なし。

 

 

OS & wine 4.0をクリーンインストールしても、
Windows XPのゲーム「サイレントハンターⅡ」が
起動できたり、失敗したり。。。

 

 

そう、何度かログオフして、このゲームを再起動すると
正常に起動できたりするんです。不思議???

 

 

もう、諦めております。
なので、今回はこんな話。

 

 

ーーーーーーーーー

 

 

昔、職場の同僚の女性が
目をしょぼしょぼさせながら。。。

 

 

必死にExcelの数字を見ている。

 

 

何してんの?

 

 

と聞いたら、

 

 

セル○の値が同じ行をシート○とシート△で比較して、
セル△の値が違うのが何件あるのか
全件計算しているんですが。。。
Excelの関数を組み合わせただけじゃどうやっていいのか?
なので、ソートとフィルタを駆使しているんですけど、
レコード数が多くて。。。

 

 

と。
それを聞いた私は、

 

 

それ、マクロにしちゃえばいいじゃん。

 

 

えっ! マクロ?

 

 

えっ! 知らないの?

 

 

そんな会話をした後、
やりたいことを(手順を)聞いて、
昼休みにコーディング。(突貫工事)

 

 

最初は、バグったりしましたが。。。
性能は二の次にして完成。

 

 

マクロ化したら、
どうやら数日仕事だった作業が。。。
なんと約1分に。(最近のCPUは早いねぇ。)

 

 

個人的には、できる限りマクロ化しないほうが良いと思うし、
先人が作ったVBAのソースをメンテするのは嫌い。
(解析に時間がかかりそうなら、1から作り直しちゃいます。w)

 

 

でも、処理をループさせるときは、マクロは便利だと思う。

 

 

VBAって聞いただけで「ダメ」ってなる人が多いんだけれども、
10個ぐらい構文を覚えるだけで、大概の作業は自動化できると。

 

 

性能や見た目を重視するテクニック等は、
ある程度、実力をつけてからで良いと思います。

 

 

例えば、
先頭の画像のExcelは、「集計処理」ボタンを押すと
商品コードの列を検索して、
商品コード毎の件数(列の値が同じ行数)を商品件数のセルに求めます。

 

 

最後にコーディングを掲載しますが、
これを見てわかるように、
主要な構文は、If文とFor文だけです。

 

 

そして、処理は冗長です。
各行を最大行数分ループしているからです。

 

 

普通なら、CountIf文を使えよ!
となると思うのですが、
いいんです。

 

 

論理は単純だし、
最近のCPU処理性能は早い。

 

 

最初は、初歩的な構文で構わないんです。
作ってみましょう。
バグってみましょう。
原因はググるとすぐに見つかります。

 

 

Excelを使った作業を「面倒だなぁ。」と感じることが大事です。

 

 

この記事が、ExcelのVBAを学ぶきっかけになれば良いと思います。m(_ _)m

 

 

<コーディング>

 

 

Sub 集計()
'
'集計を再計算する
'
  Dim CODE As Long, COUNT As Long, WORK As Long, _
          TOTAL As Long, GYO_end As Long
  
  CODE = 1          '列A
  COUNT = 2         '列B
  WORK = 3          '列C
  TOTAL = 5         '列E

 

  Dim s1 As Worksheet 'Worksheetsオブジェクト用

 

  Set s1 = Worksheets("Sheet1")   'データシート
  
  GYOU_end = s1.Range("A1").End(xlDown).Row '最終行を求める
  
  
      
  Dim i As Long, n As Long
  

 

  For i = 2 To GYOU_end     'シート”Sheet1”の全レコードをひとつづつ抽出
  
    Dim t As Long
    
    If s1.Cells(i, CODE).Value <> "" And _
        s1.Cells(i, COUNT).Value >= 1 Then
                
        t = s1.Cells(i, COUNT).Value
    Else
        
        t = 1
    End If
    
      
    For n = 2 To GYOU_end                          '全レコード分処理を行う
    
        If i <> n And _
            s1.Cells(i, CODE).Value <> "" And _
            s1.Cells(i, CODE).Value = s1.Cells(n, CODE).Value Then  
                       '同じコードか?
                                                                    'YES ---
            
            t = t + 1                                           'カウントアップ
            
        End If
    
    Next
    
    If t > 0 Then
    
        s1.Cells(i, COUNT).Value = t              '合計値をセット
    End If
  Next
  
  s1.Range("A:B").RemoveDuplicates Columns:=Array(1), Header:=xlYes
                                                                    '重複削除
  
  s1.Cells(1, TOTAL).Value = s1.Range("A1").End(xlDown).Row - 1    
                                                                   '行数-1 すなわち合計
  
End Sub

 

« Linux Mint 19にWine 4.0をインストールしてみた。ゲームが動かないよ?! | トップページ | Linux Mint 19でMinitubeが動作しない(Error transferringとなる)。 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: それ、マクロにすりゃいいのに! -Excelマクロ VBAのお話し。-:

« Linux Mint 19にWine 4.0をインストールしてみた。ゲームが動かないよ?! | トップページ | Linux Mint 19でMinitubeが動作しない(Error transferringとなる)。 »

フォト
無料ブログはココログ

bigmoroの関連リンク