Formula Kustom Tidak Memperbarui

5

Saya mengikuti panduan ini untuk membuat fungsi kustom berikut yang menghitung jumlah sel warna tertentu dalam spreadsheet saya:

Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
Dim rCell As Range
Dim lCol As Long
Dim vResult
lCol = rColor.Interior.ColorIndex
    If SUM = True Then
       For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
                vResult = WorksheetFunction.SUM(rCell) + vResult
        End If
       Next rCell
    Else
        For Each rCell In rRange
        If rCell.Interior.ColorIndex = lCol Then
                vResult = 1 + vResult
        End If
       Next rCell
End If
ColorFunction = vResult
End Function

Ini berfungsi dengan baik dan memberi saya hasil yang diharapkan jika saya mengklik tanda centang hijau di bilah rumus tetapi tidak akan memperbarui secara otomatis setelah saya mewarnai sel lain. Bagaimana cara mengaturnya untuk memperbarui hitungan secara otomatis setiap kali saya mewarnai sel secara manual di tempat lain di spreadsheet?

Info tambahan: Saya menggunakan Excel di Mac dan saya sudah memeriksa pengaturan dan menghitung secara otomatis dihidupkan.

pengguna2463758
sumber

Jawaban:

5

Excel Menghitung Ulang UDF Hanya Saat Inputnya Berubah

Anda telah membuat Fungsi Buatan Pengguna (UDF). Excel hanya menjalankan kode UDF ketika sel yang berfungsi sebagai input ke fungsi berubah.

Misalnya, saya punya UDF ini:

Public Function MyFunction(Target As Range)
MsgBox "The target cell's address is " &  Target.Address
End Function

Dan di sel A1 di lembar kerja saya, saya mereferensikan sel dengan rumus:

=MyFunction(A2)

Selama penggunaan normal buku kerja saya, kode UDF saya hanya akan dipanggil jika ada perubahan pada isi sel A2 atau sel lain yang dirujuk oleh rumus dalam A2.

Solusi

Anda dapat mengatasi perilaku ini dengan beberapa cara:

  1. Memaksa Excel untuk menghitung ulang semua rumus di buku kerja secara manual bahkan jika mereka tidak berubah sejak perhitungan terakhir dengan menekan Ctrl + Alt+ F9pada Windows dan (saya berasumsi pada Mac) Cmd+ Alt+ F9. Jika itu tidak berhasil, Anda juga dapat mencoba menambahkan Shiftformula tambahan yang memeriksa ulang sebelum menghitung ulang.
  2. Sertakan fungsi yang mudah menguap di salah satu sel yang dirujuk oleh UDF Anda. Lakukan ini dengan memodifikasi definisi fungsi VBA Anda untuk menerima parameter tambahan:

    Public Function MyFunction(Target As Range, Optional VolatileParameter As Variant)

    Kemudian edit sel yang mereferensikan UDF Anda untuk melewatkan hasil fungsi volatile seperti Now()ke UDF:

    =MyFunction(A2,Now())

    Hasil akhirnya adalah bahwa Excel akan menganggap sel yang berisi referensi ke UDF Anda perlu dihitung ulang setiap kali lembar kerja diubah karena referensi fungsi volatil.

  3. Edit sel yang berisi UDF. Cukup memasukkan sel lalu menekan Enter tanpa membuat perubahan harus cukup untuk memicu pembaruan.

  4. Buat tombol makro yang menjalankan baris kode berikut :

    Application.CalculateFull
  5. Tempatkan kode berikut di acara Open Workbook Anda:

    ActiveWorkbook.ForceFullCalculation = True

    Ini menyebabkan Excel selalu menghitung ulang semua rumus , terlepas dari apakah itu percaya perhitungan ulang diperlukan. Pengaturan ini tetap berlaku sampai Excel dimulai ulang.


Mengapa Excel Tidak Selalu Menghitung Ulang UDF Saya?

Saat Excel melakukan perhitungan ulang otomatis, Excel tidak menghitung ulang setiap rumus tunggal di buku kerja. Alih-alih itu hanya memperbarui sel-sel yang berisi formula yang merujuk ke sel yang paling baru dimodifikasi. Metode ini menghindari proses yang jauh lebih lama dari melakukan banyak perhitungan yang tidak perlu di seluruh buku kerja hanya untuk menghasilkan hasil yang sama untuk sebagian besar dari mereka.

Dengan UDF, satu-satunya referensi dalam buku kerja yang diketahui oleh mesin penghitung Excel adalah yang diidentifikasi dalam input fungsi. Excel tidak dapat memeriksa kode VBA dalam UDF dan mengidentifikasi sel - sel lain yang dapat memengaruhi output fungsi. Jadi, sementara penulis fungsi dapat membangun fungsi untuk mengembalikan hasil yang berbeda berdasarkan sejumlah perubahan yang dibuat dalam buku kerja, satu-satunya sel yang Excel tahu akan mengubah hasil fungsi adalah input yang dinyatakan. Oleh karena itu, perubahan pada sel-sel ini adalah satu-satunya yang diperhatikan Excel ketika memutuskan apakah UDF perlu dihitung ulang.

Peniru Twisty
sumber
2

Saya menekan ini sambil berharap untuk memperbarui semua fungsi yang ditentukan pengguna setiap kali kotak teks ActiveX diubah bahkan jika mereka tidak mempengaruhi sel terkait yang digunakan sebagai input ke UDF. Kebetulan saya menemukan bahwa termasuk setiap referensi sel tidak langsung dalam panggilan fungsi muncul untuk membuatnya berjalan setiap kali (tampaknya) sel lain diedit. Agaknya ini karena excel memiliki lebih sedikit jaminan tentang apa yang dapat dipercaya untuk tidak dimodifikasi ketika pengubah tidak langsung digunakan. Ini mirip dengan jawaban kedua Twisty Impersonator tetapi menambahkan sedikit kesalahan pada kode dan formula vba Anda (selama setidaknya satu rentang digunakan dalam fungsi).

Contoh: Fungsi ini harus selalu mengembalikan nilai dalam 'A2'

Public Function test(some_arg)
test = Sheets("Sheet1").Range("A2").Value
End Function

Jika Anda menyebutnya suka, =test(B1)itu tidak akan diperbarui setiap kali A2 berubah. Jika Anda menyebutnya suka =test(INDIRECT(ADDRESS(ROW(B1),COLUMN(B1))), secara fungsional setara, dan akan diperbarui setiap kali A2 berubah.

=test(INDIRECT("B1")) akan juga berfungsi dan mungkin lebih bersih untuk memahami contoh ini, tetapi karena "B1" adalah string, Anda tidak akan dapat menyalin rumus di seluruh nilai baru.

dchu58
sumber
1

Perubahan format (yang mencakup Perubahan Warna ) tidak dianggap sebagai peristiwa yang layak dihitung ulang di Excel. Itu tidak terkait dengan fungsi yang ditentukan pengguna. Oleh karena itu, setiap perubahan format tidak akan menghasilkan perhitungan ulang.

Itu tidak sewenang-wenang, tetapi masuk akal, karena biasanya perubahan format tidak mempengaruhi hal lain, sehingga perhitungan ulang - yang mahal - akan sia-sia. Karena Excel sekarang memungkinkan VB untuk menggunakan informasi format dan bereaksi terhadapnya, ini bisa menjadi masalah, seperti untuk Anda.

Anda mungkin dapat mengatur fungsi OnChange untuk semua sel, dan memicu perhitungan ulang di sana, tetapi perubahan format mungkin tidak memecat fungsi ini juga (saya tidak pernah mencoba).

Aganju
sumber
Masalah OP ada hubungannya dengan bagaimana Excel menghitung ulang UDF. Meskipun Anda benar bahwa perubahan format tidak memicu perhitungan ulang, tidak benar sembarang perhitungan ulang akan memperbarui UDF-nya. Memahami perbedaan ini sangat penting untuk menyelesaikan masalah ini dengan benar.
Peniru Twisty
1

Tak satu pun dari ini bekerja untuk saya. Saya menemukan bahwa satu-satunya cara saya dapat menghitung UDF saya adalah dengan menambahkan kode di bawah ini ke worksheet. Aktifkan acara dan arahkan fokus ke lembar lain di buka. Lalu ketika saya mengklik tab ke lembar utama itu berhasil.

Application.CalculateFullRebuild 
Jim Brizendine
sumber